【问题标题】:Match all variants of short form of example (e.g.) in python regex在 python 正则表达式中匹配所有简短示例(例如)的变体
【发布时间】:2020-06-25 05:11:58
【问题描述】:

我想识别简短示例的所有变体,例如并将其替换为空格。 我尝试的正则表达式如下所示。它匹配例如但不匹配其他变体。我做错了什么?

(?:^|\s)([e]\.[g](\.)?)(?=\s|$)

数据输入是

e.g E.g E.G. e.g.

正则表达式应该匹配所有这些变体。

可以在https://regex101.com/r/oFQxYJ/5尝试正则表达式

【问题讨论】:

    标签: python python-3.x regex string


    【解决方案1】:

    如果您使用re.IGNORECASE,则您的正则表达式已经在工作,例如:

    import re
    pat = "(?:^|\s)([e]\.[g](\.)?)(?=\s|$)"    # unchanged from question
    data = "e.g E.g E.G. e.g."
    regex = re.compile(pat, re.IGNORECASE)     # note the IGNORECASE
    print(regex.findall(data))
    

    给予

    [('e.g', ''), ('E.g', ''), ('E.G.', '.'), ('e.g.', '.')]
    

    或者如果您不想使用re.IGNORECASE,则在字符类中包含大写变体:

    import re
    pat = "(?:^|\s)([eE]\.[gG](\.)?)(?=\s|$)"   # note the [eE] and [gG] here
    data = "e.g E.g E.G. e.g."
    regex = re.compile(pat)
    print(regex.findall(data))
    

    (与上面相同的输出)。

    但默认情况下,[e] 将是区分大小写的匹配项(在这种情况下,[ ... ] 没有任何区别,因为它意味着匹配方括号内的任何字符,但是只有一个)。

    然后用空格替换,使用sub。这将替换 all 行中的匹配项,因此等效于 findall。例如:

    import re
    pat = "(?:^|\s)([eE]\.[gG](\.)?)(?=\s|$)"
    data2 = "test e.g test E.g test E.G. test e.g. test"
    regex = re.compile(pat)
    print(regex.sub(" ", data2))    # <== using sub
    

    给予

    test  test  test  test  test
    

    【讨论】:

    • 在 regex101 中,除了第一个变体之外,它没有显示与任何变体的匹配,尽管 i 用于不区分大小写的匹配。这让我很困惑。让我再检查一下。谢谢
    • @Sid 您可能需要在该网站上使用“全球”。这里我使用findall
    • @alaiwi,是的,这就是问题所在。谢谢。
    【解决方案2】:

    我不知道在一个正则表达式中搜索和替换的代码,但要搜索:

    ([eE]\.[gG]\.{0,1})
    

    有点不精确,还是推出的版本

    ((例如)|(例如)|(例如)|(例如))

    【讨论】:

    • ((e\.g)|(E\.g)|(E\.G\.)|(e\.g\.)) 我的意思是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2010-10-06
    • 2015-06-20
    相关资源
    最近更新 更多