如果字符串包含X个以@#$开头的单词,则Python正则表达式匹配:

时间:2018-12-25 14:20:09

标签: python regex

我要尝试的是匹配字符串,如果该字符串包含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

4 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式,前提是这些符号仅在单词字符之前使用:

(?:]\B[@#$:]\w+[^@#$:]*){5}

RegEx Demo

代码:

>>> 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']