首页 > 解决方案 > 返回所有单词的正则表达式,星号之间的任何文本除外

问题描述

我正在尝试找到一个正则表达式,它将按原样分割文本\w+,但跳过两个星号之间的任何内容。

我可以使用以下内容识别标记的内容:(?<=\*)(.*)(?=\*).

我尝试使用像这样的否定前瞻/后瞻语句:(?<!\*)([\w]+)(?!\*),但这匹配每个单词,包括星号之间的单词,除了星号之前和之后的第一个字符(例如句子“河流*运行缓慢*但肯定" 将匹配The, river, uns, slowl, but, surely, 而所需的匹配只有The, river,butsurely)。

我还尝试用非捕获组包围原始表达式:(?:\*(.*?)\*),我希望它不会从我的测试字符串中返回任何内容,但奇怪的是返回了它在没有非捕获的情况下所做的事情。

任何帮助将不胜感激。我整个早上都在阅读它,并且在这一点上并没有减少困惑。我在这里浏览了 [regex] 标签,用谷歌搜索,阅读了正则表达式,但无法组合出适合我需要的表达式。

标签: pythonregex

解决方案


您可以匹配您不需要的内容并匹配并捕获您需要的内容:

\*[^*]*\*|(\w+)

请参阅正则表达式演示。如果在正则表达式模式中定义了捕获组,则re.findall仅返回捕获的子字符串。

细节

  • \*[^*]*\*- a *,然后是除 a 之外的任何 0+ 个字符*,然后是 a*
  • |- 或者
  • (\w+)- 捕获组 1:一个或多个单词字符(字母、数字、下划线)。要仅匹配字母,请使用([^\W\d_]+).

请参阅Python 演示

import re
s = "The river *runs slowly* but surely"
res = re.findall(r'\*[^*]*\*|(\w+)', s)
print(list(filter(None, res)))
# => ['The', 'river', 'but', 'surely']

推荐阅读