我想捕获字符串中的所有[[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
模块实现此功能?
答案 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没有看到你修改过的答案