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

时间:2017-12-08 17:40:27

标签: python regex backreference

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

我需要匹配字符串,我尝试使用此正则表达式(\w)\1{1,}来捕获字符串的重复值,但此正则表达式仅捕获连续重复的字符串;我坚持要改进我的正则表达式以捕获所有重复的值,如下所示:

import re

str = 'capitals'

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

Output None

import re

str = 'butterfly'

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

<_sre.SRE_Match object; span=(2, 4), match='tt'>

2 个答案:

答案 0 :(得分:2)

我会使用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']

返回数组

答案 1 :(得分:0)

希望下面的代码将帮助您了解Python RegEx的Backreference概念

在给定的字符串str中有两组信息可用

  1. 员工基本信息:

    • 以@employeename开头,以employeename结尾
    • 例如:@daniel dxc chennai 45000男daniel
  2. 员工指定

    • 以%employeename开始,然后为名称,以employeename%结尾
    • 例如:%daniel python开发人员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)