【问题标题】:Python regex words boundary with unexpected resultsPython 正则表达式单词边界与意外结果
【发布时间】:2016-10-05 13:41:22
【问题描述】:
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("----------")

('开', '') ('', '') ('', '任何') ('', '') ('上', '') ('', '') ('', '任何')

('', '')

开启

任何

开启

任何


已阅读互联网和 S.O. 上的许多文章。我想我还是不明白正则表达式的词边界:\b

第一个正则表达式没有给我预期的结果,我认为它必须给我“ON Any On Any”,但它仍然没有给我。

第二个正则表达式给了我元组,我不知道为什么也不明白: ('', '') 的含义

第三个正则表达式在分隔行和中间的空行上打印结果

请您帮我理解一下。

【问题讨论】:

    标签: python regex word-boundary


    【解决方案1】:

    请注意,要匹配ON ANY,您需要在ONANY 之间添加一个转义(因为您使用的是re.VERBOSE 标志)空格作为\b 字边界是一个零-width 断言 不消耗任何文本,只是断言特定字符之间的位置。这就是您第一次使用re.compile(r''' \bON\bANY\b''', re.VERBOSE) 方法失败的原因。

    使用

    rx = re.compile(r''' \bON\ ANY\b ''', re.VERBOSE|re.IGNORECASE)
    

    Python demo

    re.compile(r'''\b(ON)?\b(Any)?''', re.VERBOSE) 返回元组,因为您在模式中定义了(...)捕获组

    re.compile(r'''\b(?:ON)?\b(?:Any)?''', re.VERBOSE) 匹配可选序列,ONAny,因此您将这些单词作为值。你也会得到空值,因为这个正则表达式只能匹配一个单词边界(所有其他子模式都是可选的)。

    有关单词边界的更多详细信息:

    【讨论】:

    • \b 有很多帮助。当然,这不是万能的补救措施,re.UNICODE 有时是必要的,甚至(?<!\S)/(?!\S) 环顾四周也可以产生更好的选择,但重点是它不会移动正则表达式索引。如果你有空格,匹配它。
    • 谢谢@Wiktor 我认为我的误解是我无法想象 \b 的有用用法,以防我必须写“ON”和“Any”之间的空白,但是像这样的例子我现在想它有时可能有用,正则表达式是\bON\b,搜索字符串是ON#AnyON!Any但是在我的第一个正则表达式"\bON\bAny"中,我必须写空格,因为\b 是零宽度长度
    • 对不起,我是 stackoverflow 的新手,还在学习它的格式,所以我多次删除了评论以正确编写它但我会感谢您的支持
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2011-03-28
    • 2021-06-18
    • 2014-06-07
    相关资源
    最近更新 更多