我要尝试的是匹配字符串,如果该字符串包含X量(假设为5)以@#$:字符开头的单词。
假设X为5的示例:
@someword someotherword anotherword word1 word2 word3 => false
@someword :someotherword #anotherword $word1 word2 word3 => false
@someword :someotherword #anotherword $word1 #word2 $word3 => true
答案 0 :(得分:2)
您可以使用此正则表达式,前提是这些符号仅在单词字符之前使用:
(?:]\B[@#$:]\w+[^@#$:]*){5}
代码:
>>> arr = ['@someword someotherword anotherword word1 word2 word3',
'@someword :someotherword #anotherword $word1 word2 word3',
'@someword :someotherword #anotherword $word1 #word2 $word3']
>>> reg = re.compile(r'(?:\B[@#$:]\w+[^@#$:\n]*){5}');
>>> for i in arr:
... print(reg.findall(i))
...
[]
[]
['@someword :someotherword #anotherword $word1 #word2 ']
\B
:匹配\b
不匹配的地方。 [@#$:]\w+
:匹配从[@#$:]
开始的1个以上的单词字符[^@#$:]*
:匹配0个或多个不包含[@#$:]
的字符(...){5}
:在当前输入中匹配其中的5个答案 1 :(得分:0)
像这样吗?
import re
my_re = '[#@$:][a-zA-Z]*'
my_string = "#hello :my #name $is $stef"
print(len(re.findall(my_re,my_string)) >= 5)
答案 2 :(得分:0)
积极的前瞻是做到这一点的一种方法:
input = "@someword :someotherword #anotherword $word1 #word2 $word3"
result = re.match(r'.*((?<=\s)|(?<=^))[@#$:]\S+.*(\s[@#$:]\S+.*){4}', input)
if result:
print("Found a match")
这个问题很棘手,因为您想将单词以特殊符号[@#$:]
开头。但是,我们不能仅使用单词边界\b
,因为特殊字符不是单词字符。因此,相反,我们可以检查目标词开头之前是空格还是或字符串的开头。
答案 3 :(得分:0)
正确的正则表达式为((?:[@#$].+){5})
。 Regex explanation
示例:
import re
...
tst = """
@someword someotherword anotherword word1 word2 word3
@someword :someotherword #anotherword $word4 #word5 $word6
@someword :someotherword #anotherword $word1 word2 word3
@someword :someotherword #anotherword $word1 #word2 $word3
"""
res = re.findall(r"((?:[@#$].+){5})", tst)
print(res)
结果:
['@someword :someotherword #anotherword $word4 #word5 $word6', '@someword :someotherword #anotherword $word1 #word2 $word3']