正则表达式,返回除星号之间的任何文本外的所有单词

时间:2019-02-06 15:24:11

标签: python regex

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

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

我尝试使用否定的前向/后向语句,例如:(?<!\*)([\w]+)(?!\*),但这会匹配所有单词,包括星号之间的单词,但星号前后的第一个字符除外(例如,句子“河流*缓慢行驶*但可以肯定”将匹配Theriverunsslowlbutsurely,而所需匹配项只有Theriverbutsurely)。

我还尝试用一个非捕获组:(?:\*(.*?)\*)将原始表达式括起来,我本来希望不从我的测试字符串中返回任何内容,但是奇怪的是,它完全返回了没有捕获的情况。 / p>

任何帮助将不胜感激。我整个上午都在阅读有关它的内容,在这一点上我并不感到困惑。我在Google上浏览了[regex]标记,阅读了有关正则表达式的信息,但无法将符合我需要的表达式组合在一起。

2 个答案:

答案 0 :(得分:2)

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

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

请参见regex demo。与re.findall一起使用,如果在正则表达式模式中定义了捕获组,则\*[^*]*\*仅返回捕获的子字符串。

详细信息

  • *-一个*,然后是除*|之外的任何0+字符
  • (\w+)-或
  • ([^\W\d_]+)-捕获第1组:一个或多个单词字符(字母,数字,下划线)。要仅匹配字母,请使用import re s = "The river *runs slowly* but surely" res = re.findall(r'\*[^*]*\*|(\w+)', s) print(list(filter(None, res))) # => ['The', 'river', 'but', 'surely']

请参见Python demo

suspend

答案 1 :(得分:0)

正则表达式可能不是此工作的正确工具。这与匹配括号/括号/花括号的问题非常相似(随便说一下)。原因是给定文本:

Here is some text *and some between asterisks* and some more and then * some between asterisks * and then normal text.

正则表达式

(?<=\*)[^*]+(?=\*)

将为您返回星号之间的文本。但是,它将返回:

and some between asterisks
and some more and then
 some between asterisks

我怀疑您实际上并不希望返回and some more then,但是正则表达式引擎无法识别第二个*是“结束”星号。

传统上,用于处理此类问题的算法涉及使用堆栈来跟踪嵌套以及您是否在一组括号内(或星号)(在您的情况下)。