免责声明:我发现了很多类似的问题,但没有发现具体的问题。有人回答后,我将其删除。
我需要找到所有被屏蔽的单词,例如:
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']
我应该如何更改愤怒规则以仅捕获那些规则?
谢谢!
答案 0 :(得分:2)
您当前的正则表达式仅检查三个或更多[a-z]
,但不进行重复检查。为了检查字母是否重复,您需要capture,然后backreference。使用您的re.IGNORECASE
\b\w*?([a-z])\1\1\w*\b
\b
与word boundary匹配\w
与word character匹配([a-z])
将字母字符捕获到\1
\1
是对第一组捕获的内容的反向引用这将匹配至少3个重复的[a-z]
,并用任意数量的\w
个单词字符包围。
答案 1 :(得分:1)
在这里,如果我们希望捕获一个单词,我们将使用带有反向引用的单词边界,其表达式类似于:
\b([a-z])\1\1\1.+?\b
# 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.
jex.im可视化正则表达式:
答案 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}}方法。如果您认为基于正则表达式的解决方案更适合您的用例,请随时使用,但是请记住,对于某些问题,可能会使用非正则表达式的解决方案。