test re compile compiled "on the fly" 给出空匹配,而不是 None
test re compile compiled "on the fly" gives an empty match, not None
我正在尝试测试一堆正则表达式案例(特别是如果某物是测量单位:5px、300mm 等)。
我能找到的关于 re.match 的所有问题告诉我,我测试如下:
import re
test_phrase_good = "5kw"
test_phrase_bad = "5XXX"
registered_units_regex = re.compile('[0-9]+kw|[0-9]+mm', re.IGNORECASE)
# test in the following way:
registered_units_regex.match(token) is not None
# so:
print(registered_units_regex.match(test_phrase_good)) # <re.Match object; span=(0, 3), match='5kw'>
print(registered_units_regex.match(test_phrase_bad)) # None
符合预期。
但是,如果我想在循环中编译正则表达式,我会得到以下结果:
regex_units = [r"mm", r"kw"]
regex_string = r""
for unit in regex_units:
regex_string += r'[0-9]+{}|'.format(unit)
regex_string = regex_string.rstrip('|')
registered_units_regex = re.compile(regex_string, re.IGNORECASE)
registered_units_regex.match(test_phrase_good) is not None
# so:
print(registered_units_regex.match(test_phrase_good)) # <re.Match object; span=(0, 3), match='5kw'>
print(registered_units_regex.match(test_phrase_bad)) # <re.Match object; span=(0, 0), match=''>
这意味着我不能再使用 is None
作为测试。
这是为什么?以及我应该如何正确测试不匹配?
正则表达式末尾的|
表示它匹配一个空字符串。您应该只在备选方案之间放置 |
,而不是在它们之前或之后。您可以使用 join
来做到这一点。
您在 regex_units
和格式字符串中也有 [0-9]+
,两个地方都不需要它。
regex_units = ["mm","kw"]
regex_string = "|".join(r'[0-9]+{}|'.format(unit) for unit in regex_units)
我正在尝试测试一堆正则表达式案例(特别是如果某物是测量单位:5px、300mm 等)。
我能找到的关于 re.match 的所有问题告诉我,我测试如下:
import re
test_phrase_good = "5kw"
test_phrase_bad = "5XXX"
registered_units_regex = re.compile('[0-9]+kw|[0-9]+mm', re.IGNORECASE)
# test in the following way:
registered_units_regex.match(token) is not None
# so:
print(registered_units_regex.match(test_phrase_good)) # <re.Match object; span=(0, 3), match='5kw'>
print(registered_units_regex.match(test_phrase_bad)) # None
符合预期。
但是,如果我想在循环中编译正则表达式,我会得到以下结果:
regex_units = [r"mm", r"kw"]
regex_string = r""
for unit in regex_units:
regex_string += r'[0-9]+{}|'.format(unit)
regex_string = regex_string.rstrip('|')
registered_units_regex = re.compile(regex_string, re.IGNORECASE)
registered_units_regex.match(test_phrase_good) is not None
# so:
print(registered_units_regex.match(test_phrase_good)) # <re.Match object; span=(0, 3), match='5kw'>
print(registered_units_regex.match(test_phrase_bad)) # <re.Match object; span=(0, 0), match=''>
这意味着我不能再使用 is None
作为测试。
这是为什么?以及我应该如何正确测试不匹配?
正则表达式末尾的|
表示它匹配一个空字符串。您应该只在备选方案之间放置 |
,而不是在它们之前或之后。您可以使用 join
来做到这一点。
您在 regex_units
和格式字符串中也有 [0-9]+
,两个地方都不需要它。
regex_units = ["mm","kw"]
regex_string = "|".join(r'[0-9]+{}|'.format(unit) for unit in regex_units)