我试图找到一个正则表达式,将分割文本\w+
会,但跳过两个星号之间的任何内容。
我能够识别标示出的内容有以下:(?<=\*)(.*)(?=\*)
。
我尝试使用负前瞻/这样的语句背后:(?<!\*)([\w]+)(?!\*)
,但是这每一个字,包括星号之间的那些比赛,第一个字符的异常之前和星号后(如句子“河*运行速度慢*但是肯定”会匹配The
,river
,uns
,slowl
,but
,surely
,而期望的比赛只有The
,river
,but
和surely
)。
我也试过围绕原始表达式使用非捕获组:(?:\*(.*?)\*)
,我期待不要从我的测试字符串返回任何东西,但奇怪的是返回正是它确实没有非捕获。
任何帮助将是非常赞赏。我一上午都念叨它,我不会在这一点上少困惑。我已经通过[正则表达式]标记了这里,用Google搜索,了解正则表达式,但不能把一个表达式一起适合我的需要。
你可以匹配你不需要和匹配和捕捉你所需要的:
\*[^*]*\*|(\w+)
见regex demo。与如果捕获组在正则表达式模式,定义只有返回捕获的子串re.findall
使用它。
细节
\*[^*]*\*
- 一个*
,那么任何0+比*
其他字符,然后*
|
- 或(\w+)
- 捕获组1:一个或多个字字符(字母,数字,下划线)。要只匹配字母,使用([^\W\d_]+)
。import re
s = "The river *runs slowly* but surely"
res = re.findall(r'\*[^*]*\*|(\w+)', s)
print(list(filter(None, res)))
# => ['The', 'river', 'but', 'surely']
正则表达式可能不适合这个工作的工具。这是非常相似匹配括号/括号/括号(叫什么你会)的问题。这样做的原因是,鉴于文本:
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
要返回,但正则表达式引擎没有识别第二*
是到“关闭”星号的方式。
随着这类事情处理算法涉及传统使用堆栈跟踪嵌套的,以及是否是内部或外部一套支架的(或在您的案件星号)。