python - 返回所有单词的正则表达式,星号之间的任何文本除外
问题描述
我正在尝试找到一个正则表达式,它将按原样分割文本\w+
,但跳过两个星号之间的任何内容。
我可以使用以下内容识别标记的内容:(?<=\*)(.*)(?=\*)
.
我尝试使用像这样的否定前瞻/后瞻语句:(?<!\*)([\w]+)(?!\*)
,但这匹配每个单词,包括星号之间的单词,除了星号之前和之后的第一个字符(例如句子“河流*运行缓慢*但肯定" 将匹配The
, river
, uns
, slowl
, but
, surely
, 而所需的匹配只有The
, river
,but
和surely
)。
我还尝试用非捕获组包围原始表达式:(?:\*(.*?)\*)
,我希望它不会从我的测试字符串中返回任何内容,但奇怪的是返回了它在没有非捕获的情况下所做的事情。
任何帮助将不胜感激。我整个早上都在阅读它,并且在这一点上并没有减少困惑。我在这里浏览了 [regex] 标签,用谷歌搜索,阅读了正则表达式,但无法组合出适合我需要的表达式。
解决方案
您可以匹配您不需要的内容并匹配并捕获您需要的内容:
\*[^*]*\*|(\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']
推荐阅读
- python - 重量转换器 GUI,按下按钮代码创建?
- mysql - MySQL子查询的执行时间
- python-3.x - Python 3.8 中从字符串转换为浮点数的问题
- c - 非 eof 时 fread 返回零
- ruby-on-rails - 在 Ruby on Rails 中设置 CSV 导出的日期范围
- python - 从(OSX | Windows | Ubuntu)编译 python 脚本到 ARM v7 32 位
- python - 如何在 semilogx 子图中格式化刻度标签
- javascript - 如何使用 vanilla javascript 制作音频播放器
- java - 我有一个伪代码问题,我不知道把我的代码放在哪里
- reactjs - Dialog打开时如何关闭MenuItem