python正则表达式模块中的递归正则表达式?

时间:2017-02-14 01:04:19

标签: python regex recursion

我想捕获字符串中的所有[[A-Za-z].]+,即字母字符后跟一个点的所有重复。

例如,在"ABC A.B.C. UVWX U.V.W.X. XYZ XY.Z."

我只想提取"A.B.C.""U.V.W.X."(因为它们是一个字符后跟一个点的重复)。

似乎我需要一个递归正则表达式来执行此操作[[A-Za-z].]+

是否可以使用python的re模块或regex模块实现此功能?

4 个答案:

答案 0 :(得分:1)

这对您有用,使用简单的re.findall表示法:

(?:(?<=\s)|(?<=^))(?:[A-Za-z]\.)+

在正则表达式中,我首先检查它是否是字符串的开头,或者字符串前面是否有空格,然后检查重复的字母+句点。我将我不想捕获的部分放入非捕获组(?:...)

你可以看到它在这里工作: https://regex101.com/r/ZwW7c7/4

Python代码(我写的):

import re
regex = r"(?:(?<=\s)|(?<=^))(?:[A-Za-z]\.)+"
string = 'D.E.F. ABC A.B.C. UVWX U.V.W.X. XYZ XY.Z.'
print(re.findall(regex,string))

输出:

  

['D.E.F。','A.B.C。','U.V.W.X。']

答案 1 :(得分:1)

您可以使用非捕获组来定义匹配,然后将其重复组合在边界字符之间(在这种情况下,不是字母或点),并捕获所有匹配的组:

<!-- language: lang-py -->

import re

MATCH_GROUPS = re.compile(r"(?:[^a-z.]|^)((?:[a-z]\.)+)(?:[^a-z.]|$)", re.IGNORECASE)

your_string = "ABC A.B.C. UVWX U.V.W.X. XYZ XY.Z."  # get a list of matches

print(MATCH_GROUPS.findall(your_string))  # ['A.B.C.', 'U.V.W.X.']

有点笨拙,但也应该完成边缘案例的工作。

P.S。以上内容也会匹配单次出现(例如A.如果它显示为独立)如果您只是在寻找多次重复,请用您选择的范围替换+(一次或多次重复) (例如{2,}两次或更多次重复)。

编辑:一个小的更改,以匹配字符串边界的开头/结尾。

答案 2 :(得分:1)

使用positive look-around assertions

>>> import re
>>> pattern = r'(?:(?<=\s)|^)(?:[A-Za-z]\.)+(?:(?=\s)|$)'
>>> re.findall(pattern, 'ABC A.B.C. UVWX U.V.W.X. XYZ XY.Z.')
['A.B.C.', 'U.V.W.X.']
>>> re.findall(pattern, 'A.B.C. UVWX U.V.W.X. XYZ XY.Z.')
['A.B.C.', 'U.V.W.X.']
>>> re.findall(pattern, 'DEF A.B.C. UVWX U.V.W.X.Y')
['A.B.C.']

更新正如@bubblebobble建议的那样,使用带有负面外观断言的\S(非空格字符)可以简化正则表达式:

pattern = r'(?<!\S)(?:[A-Za-z]\.)+(?!\S)'

答案 3 :(得分:0)

这个正则表达式似乎完成了这项工作(测试我们是在字符串的开头还是在空格之后):

\A([A-Za-z]\.)+|(?<=\s)([A-Za-z]\.)+
编辑:对不起Shawn没有看到你修改过的答案

相关问题