我正在尝试使用RegEx捕捉一个字符串中出现两次的字母(或许还有更好的方法?),例如,我的字符串是:
ugknbfddgicrmopn输出将为:
dd但是,我尝试了一些类似的方法:
re.findall('[a-z]{2}', 'ugknbfddgicrmopn')但在本例中,它返回:
['ug', 'kn', 'bf', 'dd', 'gi', 'cr', 'mo', 'pn'] # the except output is `['dd']`我还有一种方法可以获得期望的输出:
>>> l = []
>>> tmp = None
>>> for i in 'ugknbfddgicrmopn':
... if tmp != i:
... tmp = i
... continue
... l.append(i*2)
...
...
>>> l
['dd']
>>> 但那太复杂了..。
如果是'abbbcppq',那么只捕获:
abbbcppq
^^ ^^因此,输出结果为:
['bb', 'pp']然后,如果是'abbbbcppq',则捕获bb两次:
abbbbcppq
^^^^ ^^因此,输出结果为:
['bb', 'bb', 'pp']发布于 2015-12-14 15:13:43
您需要使用基于捕获组的regex,并将您的regex定义为原始字符串。
>>> re.search(r'([a-z])\1', 'ugknbfddgicrmopn').group()
'dd'
>>> [i+i for i in re.findall(r'([a-z])\1', 'abbbbcppq')]
['bb', 'bb', 'pp']或
>>> [i[0] for i in re.findall(r'(([a-z])\2)', 'abbbbcppq')]
['bb', 'bb', 'pp']注意,这里的re.findall应该返回元组列表,其中第一个组匹配的字符是第一个元素,第二个组匹配的是第二个元素。对于我们的案例,第一组中的字符就足够了,所以我提到了i[0]。
发布于 2015-12-14 15:03:36
作为一种Pythonic式的方式,您可以在列表理解中使用zip函数:
>>> s = 'abbbcppq'
>>>
>>> [i+j for i,j in zip(s,s[1:]) if i==j]
['bb', 'bb', 'pp']如果您正在处理大字符串,您可以使用iter()函数将字符串转换为迭代器,并使用itertols.tee()创建两个独立的迭代器,然后通过在第二个迭代器上调用next函数来消费第一个项目,并使用此迭代器调用zip类(在Python2.x中,使用返回迭代器的itertools.izip() )。
>>> from itertools import tee
>>> first = iter(s)
>>> second, first = tee(first)
>>> next(second)
'a'
>>> [i+j for i,j in zip(first,second) if i==j]
['bb', 'bb', 'pp']使用RegEx配方的基准测试:
# ZIP
~ $ python -m timeit --setup "s='abbbcppq'" "[i+j for i,j in zip(s,s[1:]) if i==j]"
1000000 loops, best of 3: 1.56 usec per loop
# REGEX
~ $ python -m timeit --setup "s='abbbcppq';import re" "[i[0] for i in re.findall(r'(([a-z])\2)', 'abbbbcppq')]"
100000 loops, best of 3: 3.21 usec per loop在注释中提到的最后一次编辑之后,如果你想只匹配像"abbbcppq"这样的字符串中的一对b,你可以使用finditer(),它返回匹配对象的迭代器,并使用group()方法提取结果:
>>> import re
>>>
>>> s = "abbbcppq"
>>> [item.group(0) for item in re.finditer(r'([a-z])\1',s,re.I)]
['bb', 'pp']注意,re.I是IGNORECASE标志,它使RegEx也匹配大写字母。
发布于 2015-12-14 15:08:25
使用反向引用非常简单:
import re
p = re.compile(ur'([a-z])\1{1,}')
re.findall(p, u"ugknbfddgicrmopn")
#output: [u'd']
re.findall(p,"abbbcppq")
#output: ['b', 'p']有关更多详细信息,可以参考perl中的类似问题:Regular expression to match any character being repeated more than 10 times
https://stackoverflow.com/questions/34261346
复制相似问题