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

问题描述 投票:2回答:2

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

我能够识别标示出的内容有以下:(?<=\*)(.*)(?=\*)

我尝试使用负前瞻/这样的语句背后:(?<!\*)([\w]+)(?!\*),但是这每一个字,包括星号之间的那些比赛,第一个字符的异常之前和星号后(如句子“河*运行速度慢*但是肯定”会匹配Theriverunsslowlbutsurely,而期望的比赛只有Theriverbutsurely)。

我也试过围绕原始表达式使用非捕获组:(?:\*(.*?)\*),我期待不要从我的测试字符串返回任何东西,但奇怪的是返回正是它确实没有非捕获。

任何帮助将是非常赞赏。我一上午都念叨它,我不会在这一点上少困惑。我已经通过[正则表达式]标记了这里,用Google搜索,了解正则表达式,但不能把一个表达式一起适合我的需要。

python regex
2个回答
2
投票

你可以匹配你不需要和匹配和捕捉你所需要的:

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

regex demo。与如果捕获组在正则表达式模式,定义只有返回捕获的子串re.findall使用它。

细节

  • \*[^*]*\* - 一个*,那么任何0+比*其他字符,然后*
  • | - 或
  • (\w+) - 捕获组1:一个或多个字字符(字母,数字,下划线)。要只匹配字母,使用([^\W\d_]+)

Python demo

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

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要返回,但正则表达式引擎没有识别第二*是到“关闭”星号的方式。

随着这类事情处理算法涉及传统使用堆栈跟踪嵌套的,以及是否是内部或外部一套支架的(或在您的案件星号)。

© www.soinside.com 2019 - 2024. All rights reserved.