印尼笑声的正则表达式模式(WKWK)

2024-06-28 15:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为test_text的字符串,其中包含testcase的单词:

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

对于这个范围,我假设笑词是任何只包含字母wk的词,每个字母至少包含一个

我试过:

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)

但似乎没有什么能与所有测试用例相匹配


Tags: texttestre单词wkfindallkwkwkwk
3条回答
>>> 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)以确保匹配字中至少有一个kwwk
    • 非捕获组用于避免findall只提供捕获组内匹配的文本
  • [wk]*以获取其余字符

我使用列表理解来暂时解决这个问题,假设笑词只包含wk

[word for word in test_case.split() if (set(word) == set('wk'))]

另一种选择是使用正向前瞻来为其中一个断言,并确保匹配另一个

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

解释

  • \b字边界
  • (?=[wk]*w)在右边断言一个w字符
  • w*k匹配0+次aw,然后确保匹配ak
  • [wk]*匹配0+次wk
  • \b字边界

Regex demoPython demo

比如说

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

相关问题 更多 >