正则表达式匹配3个连续的单词,以相同的字母开头和结尾

时间:2017-12-09 17:01:26

标签: regex python-3.x

我必须匹配3个以相同字母开头和结尾的连续单词

我有这样的代码:

import re

def regex(file):

    with open(file) as f:

         s=f.read()   

    rx=re.compile(r"([a-z])+\s+\1",re.I)

    r=re.findall(rx,s)

    print(r)   

    return len(r)

文件中的文字是这样的

  

dcvs xa Allo ozo zn bnro ce erdda anfgato e csdfa

我期待这个结果:

  

dcvs x a A ll o o zo zn bnro c e e rdd a a nfgato e csdfa

[('a','o'),('e','a')]
2

但我得到了这个:

['a', 'o', 'e', 'a']
4

有任何线索吗?

2 个答案:

答案 0 :(得分:0)

使用此模式..

r"([a-z])\s\1\w*([a-z])\s\2"

在您使用的模式中,您只搜索结尾的2个单词并以相同的字母开头。
要搜索3个单词,您必须告诉第3个和第4个字母来自同一个单词。这是我脑海中最简单的方式。但这不是最佳方式..

ps:答案按照评论中的建议进行了编辑..

答案 1 :(得分:0)

您可以使用

re.compile(r"[^a-z][a-z]*([a-z])[^a-z]+\1[a-z]*([a-z])[^a-z]‌​+\2[a-z]*[^a-z]",re‌​.I)

请参阅regex demo

请注意,在这种情况下,re.findall将返回元组列表(捕获值的元组),因为有2个捕获组,而re.findall仅在正则表达式中定义捕获组时返回捕获图案。

<强>详情

  • [^a-z] - 任何字符,但ASCII字母
  • [a-z]* - 0+ ASCII字母
  • ([a-z]) - 第1组:任何ASCII字母
  • [^a-z]+ - 除ASCII字母以外的任何1个字符
  • \1 - 对第1组内容的反向引用,与第1组中捕获的文本相同的文本
  • [a-z]* - 0+ ASCII字母
  • ([a-z]) - 第2组:ASCII字母
  • [^a-z]‌​+ - 除ASCII字母以外的任何1个字符
  • \2 - 对第1组内容的反向引用,与第2组中捕获的文本相同
  • [a-z]* - 0+ ASCII字母
  • [^a-z] - 除ASCII字母以外的任何1个字符

Python demo

import re
def regex(s):
    rx=re.compile(r"[^a-z][a-z]*([a-z])[^a-z]+\1[a-z]*([a-z])[^a-z]+\2[a-z]*[^a-z]",re.I)
    d=rx.findall(s)
    print(d)   
    return len(d)
print(regex('dcvs xa Allo ozo zn bnro ce erdda anfgato e csdfa'))

输出:

[('a', 'o'), ('e', 'a')]
2