在python中查找包含重复字符的单词

时间:2019-06-06 15:04:38

标签: python regex repeat

免责声明:我发现了很多类似的问题,但没有发现具体的问题。有人回答后,我将其删除。

我需要找到所有被屏蔽的单词,例如:

  

AAAAA喜欢苹果,但是BBBBB喜欢香蕉。他们的电话号码是   ffffr和ggggh。

该图案至少是重复字符的三倍。

当我使用时:

import re

p = re.compile(r'[a-z]{3,}, re.IGNORECASE)
m = p.findall('AAAAA likes apples, but BBBBB likes bananas. Their phone numbers are ffffr and ggggh.')

我只会得到所有单词(包含3个以上的字符)。

理想情况下,我只能得到:

m = ['AAAAA', 'BBBBB', 'ffffr', 'ggggh']

我应该如何更改愤怒规则以仅捕获那些规则?

谢谢!

3 个答案:

答案 0 :(得分:2)

您当前的正则表达式仅检查三个或更多[a-z],但不进行重复检查。为了检查字母是否重复,您需要capture,然后backreference。使用您的re.IGNORECASE

\b\w*?([a-z])\1\1\w*\b

See demo at regex101

这将匹配至少3个重复的[a-z],并用任意数量的\w个单词字符包围。

答案 1 :(得分:1)

在这里,如果我们希望捕获一个单词,我们将使用带有反向引用的单词边界,其表达式类似于:

\b([a-z])\1\1\1.+?\b

Demo

测试

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"\b([a-z])\1\1\1.+?\b"

test_str = "AAAAA likes apples, but BBBBB likes bananas. Their phone numbers are ffffr and ggggh."

matches = re.finditer(regex, test_str, re.MULTILINE | re.IGNORECASE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 2 :(得分:1)

您可以使用正则表达式,但我建议使用其他方式,即:

txt = 'AAAAA likes apples, but BBBBB likes bananas. Their phone numbers are ffffr and ggggh.'
words = txt.split(' ')
found = [i for i in words if len(set(i[:3].lower()))==1]
print(found) # ['AAAAA', 'BBBBB', 'ffffr', 'ggggh.']

请注意,由于最后一个元素中的found,现在.与所需的输出并不完全相同,但是我们可以按照以下方式轻松删除任何尾随的标点符号:

import string
clear_found = [i.rstrip(string.punctuation) for i in found]
print(clear_found) # ['AAAAA', 'BBBBB', 'ffffr', 'ggggh']

我的方法的说明:我得到单词的第3个字符,将它们全部转换为小写,然后使用set检查是否只有一个字母(字符)。另外,您可以使用.upper的{​​{1}}方法。如果您认为基于正则表达式的解决方案更适合您的用例,请随时使用,但是请记住,对于某些问题,可能会使用非正则表达式的解决方案。