3 回答
TA贡献1831条经验 获得超9个赞
假设这些符号仅在单词字符之前使用,您可以使用此正则表达式:
(?:]\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 个
TA贡献1825条经验 获得超4个赞
积极的前瞻将是做到这一点的一种方法:
input = "@someword :someotherword #anotherword $word1 #word2 $word3"
result = re.match(r'.*((?<=\s)|(?<=^))[@#$:]\S+.*(\s[@#$:]\S+.*){4}', input)
if result:
print("Found a match")
这个问题很棘手,因为你想用 start a special symbol 匹配单词[@#$:]。但是,我们不能只使用单词边界\b,因为特殊字符不是单词字符。因此,相反,我们可以检查目标术语开头之前的内容是空格还是字符串的开头。
TA贡献1812条经验 获得超5个赞
正确的正则表达式是((?:[@#$].+){5}). 正则表达式解释
例子:
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']
分享
添加回答
举报