Python 正则表达式边界出现意外结果
Python regex words boundary with unexpected results
import re
sstring = "ON Any ON Any"
regex1 = re.compile(r''' \bON\bANY\b''', re.VERBOSE)
regex2 = re.compile(r'''\b(ON)?\b(Any)?''', re.VERBOSE)
regex3 = re.compile(r'''\b(?:ON)?\b(?:Any)?''', re.VERBOSE)
for a in regex1.findall(sstring): print(a)
print("----------")
for a in regex2.findall(sstring): print(a)
print("----------")
for a in regex3.findall(sstring): print(a)
print("----------")
('ON', '')
('', '')
('', 'Any')
('', '')
('ON', '')
('', '')
('', 'Any')
('', '')
ON
Any
ON
Any
在互联网上阅读了很多文章 S.O。我想我还是不明白正则表达式的词边界:\b
第一个正则表达式没有给我预期的结果我认为它必须给我 "ON Any On Any" 但它仍然没有给我那个。
第二个正则表达式给了我元组,我不知道为什么或不理解以下的含义:('', '')
第三个正则表达式在分隔行和中间的空行上打印结果
你能帮我理解一下吗。
请注意,要匹配 ON ANY
,您需要在 ON
和 ANY
之间添加转义(因为您使用的是 re.VERBOSE
标志)space 作为\b
字边界 作为 零宽度断言 不消耗任何文本,只是断言特定字符之间的位置。这就是您第一次 re.compile(r''' \bON\bANY\b''', re.VERBOSE)
方法失败的原因。
使用
rx = re.compile(r''' \bON\ ANY\b ''', re.VERBOSE|re.IGNORECASE)
re.compile(r'''\b(ON)?\b(Any)?''', re.VERBOSE)
returns 元组,因为您在模式中定义了(...)
捕获组。
re.compile(r'''\b(?:ON)?\b(?:Any)?''', re.VERBOSE)
匹配可选序列,ON
或 Any
,因此您将这些词作为值。您也会得到空值,因为此正则表达式只能匹配单词边界(所有其他子模式都是可选的)。
关于单词边界的更多详细信息:
- Word boundaries at Regular-Expressions.info
- Java Regex Word Boundaries(这仍然是正则表达式中的单词边界,这里也适用)
import re
sstring = "ON Any ON Any"
regex1 = re.compile(r''' \bON\bANY\b''', re.VERBOSE)
regex2 = re.compile(r'''\b(ON)?\b(Any)?''', re.VERBOSE)
regex3 = re.compile(r'''\b(?:ON)?\b(?:Any)?''', re.VERBOSE)
for a in regex1.findall(sstring): print(a)
print("----------")
for a in regex2.findall(sstring): print(a)
print("----------")
for a in regex3.findall(sstring): print(a)
print("----------")
('ON', '') ('', '') ('', 'Any') ('', '') ('ON', '') ('', '') ('', 'Any')
('', '')
ON
Any
ON
Any
在互联网上阅读了很多文章 S.O。我想我还是不明白正则表达式的词边界:\b
第一个正则表达式没有给我预期的结果我认为它必须给我 "ON Any On Any" 但它仍然没有给我那个。
第二个正则表达式给了我元组,我不知道为什么或不理解以下的含义:('', '')
第三个正则表达式在分隔行和中间的空行上打印结果
你能帮我理解一下吗。
请注意,要匹配 ON ANY
,您需要在 ON
和 ANY
之间添加转义(因为您使用的是 re.VERBOSE
标志)space 作为\b
字边界 作为 零宽度断言 不消耗任何文本,只是断言特定字符之间的位置。这就是您第一次 re.compile(r''' \bON\bANY\b''', re.VERBOSE)
方法失败的原因。
使用
rx = re.compile(r''' \bON\ ANY\b ''', re.VERBOSE|re.IGNORECASE)
re.compile(r'''\b(ON)?\b(Any)?''', re.VERBOSE)
returns 元组,因为您在模式中定义了(...)
捕获组。
re.compile(r'''\b(?:ON)?\b(?:Any)?''', re.VERBOSE)
匹配可选序列,ON
或 Any
,因此您将这些词作为值。您也会得到空值,因为此正则表达式只能匹配单词边界(所有其他子模式都是可选的)。
关于单词边界的更多详细信息:
- Word boundaries at Regular-Expressions.info
- Java Regex Word Boundaries(这仍然是正则表达式中的单词边界,这里也适用)