跳转到主要内容

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的正则表达式,带有可选的前导0x0X和一致的字母大小写

import re
re.compile('(?:(?:0x|0X)[0-9a-f]+)|(?:(?:0x|0X)[0-9A-F]+)|(?:[0-9a-f]+)|(?:[0-9A-F]+)')

使用re的正则表达式,带有可选的前导0x0X和一致的字母大小写

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') '(?PA)'
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'(?:\+&#124;-)?(?:(?:\d{1,3}(?:,\d{3})+)&#124;\d+)(?:\.\d+)?' 逗号分隔的数字格式
EURO_NUMBER r'(?:\+&#124;-)?(?:(?:\d{1,3}(?:\.\d{3})+)&#124;\d+)(?:,\d+)?' 点分隔的数字格式
HEXADECIMAL_NUMBER '(?:(?:0x&#124;0X)[0-9a-f]+)&#124;(?:(?:0x&#124;0X)[0-9A-F]+)&#124;(?:[0-9a-f]+)&#124;(?:[0-9A-F]+)' 可以带有前缀 0x0X.

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

Humre-1.0.0.tar.gz (26.5 kB 查看散列值)

上传时间 源代码

由以下支持