首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从匹配中排除任何数字,但将数字保留在括号内

从匹配中排除任何数字,但将数字保留在括号内
EN

Stack Overflow用户
提问于 2022-04-11 09:00:47
回答 1查看 60关注 0票数 1

字符串abc keyword1 ddd 111 ddd (ddd 99/ddd) 1 ddd (ddd) ddd 11 ddd keyword2 abc

regexre.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作为一个整体匹配单个单词,其中一个单词可以包含这些括号大小的组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-11 09:29:58

如果没有任何其他包,您可以使用两步方法:获取关键字之间的字符串,然后删除括号内没有的所有数字块:

代码语言:javascript
运行
复制
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(.*?)keyword2keyword1keywor2之间的所有内容提取到第1组中
  • re.sub(r'(\([^()]*\))|\s*\d+', r'\1', m.group(1))从Group 1值中删除任何带有可选空格的数字块,同时保持()之间的所有字符串保持不变。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71825152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档