Шаблон регулярного выражения для индонезийского смеха (wkwkwk) - PullRequest
2 голосов
/ 21 марта 2020

У меня есть строка с именем test_text, содержащая слова контрольного примера:

wk wkw wkk kwk kkw wkwk kwkw wkkw kwkk kwkwk wkwkwk wkwoowkwko www k kkk wkwkland

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

wk wkw wkk kwk kkw wkwk kwkw wkkw kwkk kwkwk wkwkwk

и исключить (не ограничиваясь ими)

wkwoowkwko www k kkk wkwkland

Для этой области я предполагаю, что смехотворным словом является любое слово, которое содержит только буквы w и k хотя бы по одному для каждого.

Я пробовал:

import re 
re.findall("(k*w+k+w*k*)+\s", test_text)
re.findall("k?(?:w{0,2}k{0,2}w{1,2})+k\s?", test_text)
re.findall("w*[Ww]\w*k+\s", test_text)

Но, похоже, ничто не соответствует всем тестам.

Ответы [ 3 ]

0 голосов
/ 21 марта 2020
>>> s = 'wk wkw wkk kwk kkw wkwk kwkw wkkw kwkk kwkwk wkwkwk wkwoowkwko www k kkk wkwkland'
>>> re.findall(r'\b[wk]*(?:wk|kw)[wk]*\b', s)
['wk', 'wkw', 'wkk', 'kwk', 'kkw', 'wkwk', 'kwkw', 'wkkw', 'kwkk', 'kwkwk', 'wkwkwk']
  • \b, чтобы обеспечить совпадение только целых слов
  • (?:wk|kw), чтобы убедиться, что в соответствующем слове
[wk]* в начале и в конце, чтобы получить остальные символы
0 голосов
/ 21 марта 2020

Другой вариант - использовать положительный прогноз для утверждения одного из них и сопоставления с другим.

\b(?=[wk]*w)w*k[wk]*\b

Пояснение

  • \b Граница слова
  • (?=[wk]*w) Установить w символ справа
  • w*k Совпадение 0+ раз w, затем убедитесь, что оно соответствует k
  • [wk]* Соответствие 0+ раз либо w, либо k
  • \b Граница слова

Regex demo | Python демо

Например

import re

regex = r"\b(?=[wk]*w)w*k[wk]*\b"
test_str = "wk wkw wkk kwk kkw wkwk kwkw wkkw kwkk kwkwk wkwkwk wkwoowkwko www k kkk wkwkland"
print(re.findall(regex, test_str))

Выход

['wk', 'wkw', 'wkk', 'kwk', 'kkw', 'wkwk', 'kwkw', 'wkkw', 'kwkk', 'kwkwk', 'wkwkwk']
0 голосов
/ 21 марта 2020

Я использовал списочные выражения, чтобы временно решить проблему, предполагая, что смеющиеся слова содержат только w и k:

[word for word in test_case.split() if (set(word) == set('wk'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...