使用带有反向引用的Python正则表达式匹配

3

我对带有反向引用的正则表达式有疑问。

我需要匹配字符串,我尝试使用这个正则表达式(\w)\1{1,}来捕获我的字符串中重复的值,但是这个正则表达式只能捕获连续重复的字符串;我卡在了如何改进我的正则表达式以捕获所有重复值上,以下是一些示例:

import re

str = 'capitals'

re.search(r'(\w)\1{1,}', str)

输出无

import re

str = 'butterfly'

re.search(r'(\w)\1{1,}', str)
<_sre.SRE_Match对象; span=(2, 4), 匹配='tt'>

你在第一个例子中尝试匹配什么? - Barmar
您可以在反向引用前使用 .*,以允许匹配之间出现任何内容。 - Barmar
@Barmar 我正在尝试匹配字母a的重复出现。 - Jess
使用 r'(\w)\w*\1' - Wiktor Stribiżew
@user3722709 你还没有说你期望的输出是什么。aa 还是 apita - Barmar
2个回答

6
我会使用r'(\w).*\1,这样即使在重复字符之间有特殊字符或空格,也可以允许任何重复的字符。
但是这对于包含重叠组内容的重复字符的字符串(如字符串abcdabcd)不起作用,其中它仅识别第一个组,忽略第一个组中封闭的其他重复字符(b,c,d)。
请检查演示:https://regex101.com/r/m5UfAe/1 因此,一种替代方法(根据您的需求)是对分析的字符串进行排序:
import re
str = 'abcdabcde'
re.findall(r'(\w).*\1', ''.join(sorted(str)))

返回包含重复字符的数组 ['a','b','c','d']


这里可以工作!但是当我删除排序内置函数时,您能解释为什么输出不正确吗?!?使用排序的输出:re.findall(regex_pattern, ''.join(sorted("testing this".lower()))) ['i', 's', 't']不使用排序的输出:re.findall(regex_pattern, ''.join("testing this".lower()))['t'] - Jess
如果你不对它进行排序,那么你只是返回相同的字符串。 - Barmar

2
希望下面的代码能帮助您理解Python RegEx中的反向引用概念。
在给定的字符串str中有两组信息可用:
1. 员工基本信息: - 以@employeename开始,以employeename结束 - 例如:@daniel dxc chennai 45000 male daniel
2. 员工职称: - 以%employeename开始,然后是职称,以employeename%结束 - 例如:%daniel python developer daniel%
import re

#sample input

str="""
@daniel dxc chennai 45000 male daniel @henry infosys bengaluru 29000 male hobby- 
swimming henry
@raja zoho chennai 37000 male raja @ramu infosys bengaluru 99000 male hobby-badminton 
ramu
%daniel python developer daniel% %henry database admin henry%
%raja Testing lead raja% %ramu Manager ramu%
"""

#backreferencing employee name (\w+)  <----  \1
#----------------------------------------------
basic_info=re.findall(r'@+(\w+)(.*?)\1',str)
print(basic_info)

#(%) <-- \1  and (\w+) <--- \2 
#-------------------------------
designation=re.findall(r'(%)+(\w+)(.*?)\2\1',str)
print(designation)

for i in range(len(designation)):
    designation[i]=(designation[i][1],designation[i][2])
print(designation)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接