Python的人可读正则表达式模块。Humre为您处理正则表达式语法并创建传递给Python的re.compile()函数的正则表达式字符串。发音为“hum,ree”。
项目描述
Humre
Python的人可读正则表达式模块。Humre为您处理正则表达式语法并创建传递给Python的re.compile()函数的正则表达式字符串。发音为“hum,ree”。
它类似于Swift的正则表达式DSL或Python正则表达式re.VERBOSE
模式的扩展形式。代码比编写更常被阅读,所以verbose的Humre代码可能需要更长的时间来编写,但通过更容易阅读和理解来弥补。
请注意,在发布1.0版本之前,此模块的API可能会更改。请将建议和反馈发送至al@inventwithpython.com。
快速入门
>>> import re
>>> from humre import *
>>> regexStr = either(OPEN_PAREN + exactly(3, DIGIT) + CLOSE_PAREN, exactly(3, DIGIT)) + '-' + exactly(3, DIGIT) + '-' + exactly(4, DIGIT)
>>> regexStr
'\\(\\d{3}\\)|\\d{3}-\\d{3}-\\d{4}'
>>> patternObj = re.compile(regexStr)
>>> matchObj = patternObj.search('Call 415-555-1234 today!')
>>> matchObj
<re.Match object; span=(5, 17), match='415-555-1234'>
>>> matchObj.group()
'415-555-1234'
常见问题解答
Humre提供什么?
Humre提供了一组函数和常量,用于创建正则表达式字符串,而无需知道特定的正则表达式符号。这些比正则表达式字符串提供了更多的结构和可读性。
我需要知道正则表达式才能使用Humre吗?
是也是否。你仍然需要了解正则表达式是什么以及它们是如何使用的。但与其记忆每个正则表达式特征的标点符号,你不如使用更容易记忆的Humre函数和常量。例如,如果你对正则表达式不熟悉,zero_or_more(chars('a-z'))
比[a-z]*
更容易记忆。但我建议在使用Humre之前先阅读一份通用的正则表达式教程。
Python的re模块有什么问题?
更多是正则表达式语法的缺陷。正则表达式字符串看起来像是一堆神秘的标点符号,即使你是一名经验丰富的软件工程师,复杂的正则表达式字符串也可能难以阅读和调试。
详细模式能否解决这个问题?
有一点帮助。但是,因为详细模式仍然将正则表达式字符串作为字符串值,所以不能使用开发工具,如linters、语法高亮和匹配括号高亮。此外,处理转义字符仍然可能很痛苦。
Humre是不是Python的re模块的新实现?
不是。Humre只创建正则表达式字符串以传递给re.compile()
。
使用Humre而不是编写自己的正则表达式字符串有哪些好处?
- 你的编辑器的括号匹配功能。
- 你的编辑器的语法高亮。
- 你的编辑器的lint工具和类型提示工具可以捕获错误。
- 你的编辑器的自动完成功能。
- 像Black这样的自动格式化工具可以自动格式化你的正则表达式代码。
- Humre为你处理原始字符串和字符串转义。
- 你可以在你的Humre代码旁边放置实际的Python注释。
- 对无效正则表达式的错误信息更友好。
使用from humre import *
导入语法是个好主意吗?
在这种情况下,是的。通常不建议使用这种导入形式,但它会防止你的optional(group('cat' + DIGIT))
代码变成humre.optional(humre.group('cat' + humre.DIGIT))
。
我该如何组合Humre的函数和常量?
每个Humre函数都返回一个正则表达式字符串,每个Humre常量都是一个字符串,因此你可以使用f-strings和字符串连接来组合它们。
>>> from humre import *
>>> exactly(5, DIGIT) + optional(WHITESPACE) + one_or_more(NONWHITESPACE)
'\\d{5}\\s?\\S+'
>>> 'I am looking for %s grapes.' % (exactly(2, DIGIT))
'I am looking for \\d{2} grapes.'
>>> f'I am looking for {exactly(2, DIGIT)} grapes.''
'I am looking for \\d{2} grapes.'
Humre对初学者来说很棒,但为什么经验丰富的开发者想要使用它?
TODO
使用Humre与使用re相比,性能是否有影响?
没有。Humre函数是简单的函数,执行基本的字符串操作。你只需要在创建正则表达式模式对象时调用它们一次。你的程序,无论大小,都会花费更多的时间进行实际的模式匹配,而不是创建正则表达式字符串。
大多数正则表达式都很短,语法不会碍事。为什么对这些使用Humre?
当然,电话号码示例足够简单,任何了解正则表达式语法的人都能理解它。
Humre与re的比较
以下是Python的re
模块的代码与使用Humre的等效代码的比较(使用Black代码格式化工具格式化)。
使用re的美国电话号码
import re
re.compile('\d{3}-\d{3}-\d{4}')
使用Humre的美国电话号码
import re
from humre import *
re.compile(exactly(3, DIGIT), "-", exactly(3, DIGIT), "-", exactly(4, DIGIT))
使用re的正则表达式,带有可选的前导0x
或0X
和一致的字母大小写
import re
re.compile('(?:(?:0x|0X)[0-9a-f]+)|(?:(?:0x|0X)[0-9A-F]+)|(?:[0-9a-f]+)|(?:[0-9A-F]+)')
使用re的正则表达式,带有可选的前导0x
或0X
和一致的字母大小写
import re
from humre import *
re.compile(
either(
noncap_group(noncap_group(either('0x', '0X')), one_or_more(chars('0-9a-f'))),
noncap_group(noncap_group(either('0x', '0X')), one_or_more(chars('0-9A-F'))),
noncap_group(one_or_more(chars('0-9a-f'))),
noncap_group(one_or_more(chars('0-9A-F')))
)
)
带有或没有逗号格式化的数字,包括小数点,使用re
import re
re.compile(r'(?:\+|-)?(?:(?:\d{1,3}(?:,\d{3})+)|\d+)(?:\.\d+)?')
带有或没有逗号格式化的数字,包括小数点,使用Humre
import re
from humre import *
re.compile(
# optional negative or positive sign:
optional(noncap_group(either(PLUS_SIGN, '-'))),
# whole number section:
noncap_group(either(
# number with commas:
noncap_group(between(1, 3, DIGIT), one_or_more(noncap_group(',', exactly(3, DIGIT)))),
# number without commas:
one_or_more(DIGIT)
)),
# fractional number section (optional)
optional(noncap_group(PERIOD, one_or_more(DIGIT)))
)
或者你可以使用Humre包含的NUMBER
模式
import re
from humre import *
re.compile(NUMBER)
快速参考
以下是Humre的所有函数和常量的快速列表,以及它们生成的正则表达式字符串。
函数 | 正则表达式等效 |
---|---|
group('A') |
'(A)' |
optional('A') |
'A?' |
either('A', 'B', 'C') |
'A|B|C' |
exactly(3, 'A') |
'A{3}' |
between(3, 5, 'A') |
'A{3:5}' |
at_least(3, 'A') |
'A{3,}' |
at_most(3, 'A') |
'A{,3}' |
chars('A-Z') |
'[A-Z]' |
nonchars('A-Z') |
'[^A-Z]' |
zero_or_more('A') |
'A*' |
zero_or_more_lazy('A') |
'A*?' |
one_or_more('A') |
'A+' |
one_or_more_lazy('A') |
'A+?' |
starts_with('A') |
'^A' |
ends_with('A') |
'A$' |
starts_and_ends_with('A') |
'^A$' |
named_group('group_name', 'A') |
'(?P |
noncap_group('A') |
'(?:A)' |
positive_lookahead('A') |
'(?=A)' |
negative_lookahead('A') |
'(?!A)' |
positive_lookbehind('A') |
'(?<=A)' |
negative_lookbehind('A') |
'(? |
atomic_group('A') |
'(?>A)' |
zero_or_more_possessive('A') |
'A*+' |
one_or_more_possessive('A') |
'A++' |
optional_possessive('A') |
'A?+' |
方便的分组函数结合了 Humre 函数和 group()
(或 noncap_group()
) 函数,因为将正则表达式放入分组是如此常见,例如 ([A-Z])+
将字符类放入分组
方便函数 | 函数等效 | 正则表达式等效 |
---|---|---|
optional_group('A') |
optional(group('A')) |
'(A)?' |
optional_noncap_group('A') |
optional(noncap_group('A')) |
'(?:A)?' |
group_either('A', 'B', 'C') |
group(either('A', 'B', 'C')) |
'(A|B|C)' |
noncap_group_either('A') |
noncap_group(either('A', 'B', 'C')) |
'(?:A|B|C)' |
exactly_group(3, 'A') |
exactly(3, group('A')) |
'(A){3}' |
noncap_exactly_group(3, 'A') |
exactly(3, noncap_group('A')) |
'(?:A){3}' |
between_group(3, 5, 'A') |
between(3, 5, group('A')) |
'(A){3,5}' |
between_noncap_group(3, 5, 'A') |
between(3, 5, noncap_group('A')) |
'(?:A){3,5}' |
at_least_group(3, 'A') |
at_least(3, group('A')) |
'(A){3,}' |
at_least_noncap_group(3, 'A') |
at_least(3, noncap_group('A')) |
'(?:A){3,}' |
at_most_group(5, 'A') |
at_most(3, group('A')) |
'(A){,3}' |
at_most_noncap_group(5, 'A') |
at_most(3, noncap_group('A')) |
'(?:A){,3}' |
zero_or_more_group('A') |
zero_or_more(group('A')) |
'(A)*' |
zero_or_more_noncap_group('A') |
zero_or_more(noncap_group('A')) |
'(?:A)*' |
zero_or_more_lazy_group('A') |
zero_or_more_lazy(group('A')) |
'(A)*?' |
zero_or_more_lazy_noncap_group('A') |
zero_or_more_lazy(noncap_group('A')) |
'(?:A)*?' |
one_or_more_group('A') |
one_or_more(group('A')) |
'(A)+' |
one_or_more_noncap_group('A') |
one_or_more(noncap_group('A')) |
'(?:A)+' |
one_or_more_lazy_group('A') |
one_or_more_lazy(group('A')) |
'(A)+?' |
one_or_more_lazy_noncap_group('A') |
one_or_more_lazy(noncap_group('A')) |
'(?:A)+?' |
Humre 提供了 \d
、\w
和 \s
字符类以及需要转义的几个其他字符的常量
常量 | 正则表达式等效 |
---|---|
DIGIT |
r'\d' |
WORD |
r'\w' |
WHITESPACE |
r'\s' |
NONDIGIT |
r'\D' |
NONWORD |
r'\W' |
NONWHITESPACE |
r'\S' |
BOUNDARY |
r'\b' |
NEWLINE |
r'\n' |
TAB |
r'\t' |
QUOTE |
r"\'" |
DOUBLE_QUOTE |
r'\"' |
PERIOD |
r'\.' |
CARET |
r'\^' |
DOLLAR_SIGN |
r'\$' |
ASTERISK |
r'\*' |
PLUS_SIGN |
r'\+' |
QUESTION_MARK |
r'\?' |
OPEN_PARENTHESIS |
r'\(' |
OPEN_PAREN |
r'\(' |
CLOSE_PARENTHESIS |
r'\)' |
CLOSE_PAREN |
r'\)' |
OPEN_BRACE |
r'\{' |
CLOSE_BRACE |
r'\}' |
OPEN_BRACKET |
r'\[' |
CLOSE_BRACKET |
r'\]' |
BACKSLASH |
r'\\' |
PIPE |
r'|' |
BACK_1 |
r'\1' |
BACK_2 |
r'\2' |
BACK_3 |
r'\3' |
... | ... |
BACK_99 |
r'\99' |
Humre 还为常用模式提供了常量
Humre 模式常量 | 正则表达式等效 | 注意 |
---|---|---|
ANYTHING |
'.*?' |
懒惰的 "任何东西的零次或多次" 匹配 |
EVERYTHING |
'.*' |
贪婪的 "任何东西的零次或多次" 匹配,也称为点星 |
SOMETHING |
'.+?' |
惰性匹配 "任一或多个任意字符" |
ANYCHAR |
'.' |
|
LETTER |
(太大,无法显示) | 匹配 isalpha() |
NONLETTER |
(太大,无法显示) | 匹配 not isalpha() |
UPPERCASE |
(太大,无法显示) | 匹配 isupper() |
NONUPPERCASE |
(太大,无法显示) | 匹配 not isupper() |
LOWERCASE |
(太大,无法显示) | 匹配 islower() |
NONLOWERCASE |
(太大,无法显示) | 匹配 not islower() |
ALPHANUMERIC |
(太大,无法显示) | 匹配 isalnum() |
NONALPHANUMERIC |
(太大,无法显示) | 匹配 not isalnum() |
HEXADECIMAL |
'[0-9A-Fa-f]' |
|
NONHEXADECIMAL |
'[^0-9A-Fa-f]' |
|
NUMBER |
r'(?:\+|-)?(?:(?:\d{1,3}(?:,\d{3})+)|\d+)(?:\.\d+)?' |
逗号分隔的数字格式 |
EURO_NUMBER |
r'(?:\+|-)?(?:(?:\d{1,3}(?:\.\d{3})+)|\d+)(?:,\d+)?' |
点分隔的数字格式 |
HEXADECIMAL_NUMBER |
'(?:(?:0x|0X)[0-9a-f]+)|(?:(?:0x|0X)[0-9A-F]+)|(?:[0-9a-f]+)|(?:[0-9A-F]+)' |
可以带有前缀 0x 或 0X . |
项目详情
Humre-1.0.0.tar.gz 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 469ae0831969e01726049dc463cdba23a571c8d9fa0ecee49ac2d36f5a3290fa |
|
MD5 | 10c62ef4f8ad1a2c0c9ffa33a80e9369 |
|
BLAKE2b-256 | 10eb8189421df8b7eded688409bfd5561964abaed60dd4e49c5505fe24eb6fa2 |