Соответствие регулярному выражению Python, если строка содержит X слов, начинающихся с @ # $: - PullRequest
0 голосов
/ 25 декабря 2018

То, что я пытаюсь сделать, это сопоставить строки, если эта строка содержит количество 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 голосов
/ 25 декабря 2018

Вы можете использовать это регулярное выражение, предполагая, что эти символы используются только перед символами слова:

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

Демонстрация RegEx

Код:

>>> 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 в текущем вводе
0 голосов
/ 25 декабря 2018

Позитивный взгляд был бы одним из способов сделать это:

input = "@someword :someotherword #anotherword $word1 #word2 $word3"
result = re.match(r'.*((?<=\s)|(?<=^))[@#$:]\S+.*(\s[@#$:]\S+.*){4}', input)

if result:
    print("Found a match")

Этот вопрос сложный, потому что вы хотите сопоставить слова со специальным символом [@#$:].Но мы не можем просто использовать границы слов \b, потому что специальные символы не являются символами слов.Таким образом, вместо этого мы можем проверить, что перед началом целевого термина есть пробел, или самое начало строки.

0 голосов
/ 25 декабря 2018

Правильное регулярное выражение - ((?:[@#$].+){5}). Regex объяснение

Пример:

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']
0 голосов
/ 25 декабря 2018

Как то так?

import re

my_re = '[#@$:][a-zA-Z]*'
my_string = "#hello :my #name $is $stef"

print(len(re.findall(my_re,my_string)) >= 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...