字符串:abc keyword1 ddd 111 ddd (ddd 99/ddd) 1 ddd (ddd) ddd 11 ddd keyword2 abc
regex:re.compile(r'(?:keyword1)(.*)(?:keyword2)', flags = re.DOTALL | re.MULTILINE)
目标:从匹配中排除括号内的所有数字
期望输出:'ddd ddd (ddd 99/ddd) ddd (ddd) ddd ddd'
approach1:括号内的任何数字都是,总是 99,但括号外的数字也可以是99。这就是为什么我也可以删除匹配中的每一个数字,除了99,然后使用not删除括号外的其余99s?!
approach2:匹配ddd
(基本上包括99
),除了使用下面帮助的某些变体的所有其他数字。我到处玩(\([^)]*\)|\S)*
,但失败了,因为它的java :D
问题:哪种方法有意义?我如何修改我的正则表达式以达到我的目标?
与相关的help 从正则表达式中排除括号内的字符串? (\([^)]*\)|\S)*
,其中将一组平衡的括号视为单个字符,因此regex作为一个整体匹配单个单词,其中一个单词可以包含这些括号大小的组。
发布于 2022-04-11 09:29:58
如果没有任何其他包,您可以使用两步方法:获取关键字之间的字符串,然后删除括号内没有的所有数字块:
import re
s = "abc keyword1 ddd 111 ddd (ddd 99/ddd) 1 ddd (ddd) ddd 11 ddd keyword2 abc"
m = re.search(r'keyword1(.*?)keyword2', s, re.I | re.S)
if m:
print( re.sub(r'(\([^()]*\))|\s*\d+', r'\1', m.group(1)) )
## => ddd ddd (ddd 99/ddd) ddd (ddd) ddd ddd
见Python演示。
Notes
keyword1(.*?)keyword2
将keyword1
和keywor2
之间的所有内容提取到第1组中re.sub(r'(\([^()]*\))|\s*\d+', r'\1', m.group(1))
从Group 1值中删除任何带有可选空格的数字块,同时保持(
和)
之间的所有字符串保持不变。https://stackoverflow.com/questions/71825152
复制相似问题