【问题标题】:Python matching word by using regexPython使用正则表达式匹配单词
【发布时间】:2015-12-13 08:34:51
【问题描述】:

我正在寻找一个匹配前两个字母等于后两个字母的单词的正则表达式。一个例子可以阐明需求。

给定以下文本:

渡渡鸟是最强壮的鸟类之一。受过教育的白蚁可能会学习如何操作留声机,但这不太可能。我觉得包含岩浆的汞合金会启发爸爸。

我怎样才能得到这个输出:

answer = [('dodo', 'do'), ('sturdiest', 'st'), ('educated', 'ed'),
          ('termite', 'te'), ('phonograph', 'ph'),
          ('sense', 'se'), ('amalgam', 'am'), ('magma', 'ma'),
          ('enlighten', 'en')]

如您所见,前 2 个字符与最后 2 个字符相同。

我的想法是过滤任何长度为 4 个或更多字符的单词,并且单词的前 2 个字符与后两个字符匹配。

到目前为止,我最多可以使用 4 个或更多字符的单词。

[A-Za-z]{4,}

我不需要完整的程序,我只需要正则表达式。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您可以使用以下正则表达式:

    (\w{2})\w*\1
    

    说明:

    • (\w{2}) :匹配任意两个字母并将它们放入捕获组 1 ( )
    • \w* : 匹配零个或多个字母
    • \1 :完全匹配第一组括号中捕获的两个字母

    Regex DEMO

    【讨论】:

    • dodo 不在列表中,谢谢 另外我如何输出与显示的答案相同
    • @LeeChunHong 检查更新 :) 和 \1\2 是对第一个或第二个捕获组的反向引用
    • 请解释否决票?以便我可以改进答案?
    • 我没有对你投反对票,但我有一个建议。去掉外部括号并使用 '([A-Za-z]{2})[A-Za-z]*\\1' 之类的东西 - 或者,如果你不介意你的话中的数字,'(\w{2})\w*\\1'
    • 您只要求使用正则表达式。 'dodo' 应该在列表中。向我们展示您的 python 中的内容,然后我们可以提出建议。
    【解决方案2】:

    使用the answer of karthik manchala 提供的正则表达式的变体,并注意到您想要与问题中给出的相同的输出,这是一个完整的代码示例:

    import re
    
    inputText = """The dodo was one of the sturdiest birds.
    An educated termite may learn how to operate a phonograph,
    but it's unlikely. I sense that an amalgam that includes
    magma will enlighten Papa."""
    
    regex = re.compile(r"((\w{2})\w*\2)")
    answer = regex.findall(inputText) 
    print("answer = {}".format(answer))
    

    请注意,除了捕获前两个字符的组(\w{2}),允许中间任意数量的字符\w*,最后匹配最后的第一组\2,我已经包围了带有另一组括号( ... ) 的整个正则表达式。

    运行时,整个单词将是\1,而两个字符组是\2,使用findall 将查找所有出现并返回一个元组列表,其中每个元组是捕获组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多