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

2024-06-02 13:47:03 发布

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

我试图找到一个正则表达式,它可以像\w+那样拆分文本,但是跳过两个星号之间的任何内容。在

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

我试过使用这样的否定的前瞻/后向语句:(?<!\*)([\w]+)(?!\*),但这会匹配每个单词,包括星号之间的单词,除了星号前后的第一个字符(例如,“河流*运行缓慢*但肯定”将匹配Theriverunsslowlbutsurely,而期望的匹配只有Theriverbut和{})。在

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

任何帮助都将不胜感激。我整个上午都在读这方面的文章,在这一点上我并没有少感到困惑。我浏览了这里的[regex]标签,在google上搜索过,读过正则表达式,但无法组合出符合我需要的表达式。在


Tags: the标记文本内容表达式语句星号字符
2条回答

正则表达式可能不是这项工作的正确工具。这与匹配圆括号/方括号/大括号的问题非常相似(随便你怎么称呼它)。其原因是,鉴于文本:

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

正则表达式

^{pr2}$

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

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

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

传统上处理这类事情的算法包括使用堆栈来跟踪嵌套,以及您是在一组括号内还是在外(或者在您的例子中是星号)。在

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

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

参见regex demo。与re.findall一起使用,如果在regex模式中定义了捕获组,则只返回捕获的子字符串。在

详细信息

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

请参见Python demo

^{pr2}$

相关问题 更多 >