正则表达式最后删除不必要的字符串
Posted
技术标签:
【中文标题】正则表达式最后删除不必要的字符串【英文标题】:Regular expression to remove unnecessary string at last 【发布时间】:2018-07-24 07:40:03 【问题描述】:假设我们有:
-
ABC_ANY_STRING_DEF
ANY_STRING
ANY_STRING_DEF
ABC_CDE_ANY_STRING_DEF
“ABC_”或“CDE_”可以是前缀也可以不存在。另外,“_DEF”可以是后缀也可以不存在。
在这种情况下,我可以使用一个正则表达式在前缀和后缀之间提取 ANY_STRING(只是任何一组字符,只是一个字符串)吗? p>
例如输入=“ABC_CDE_I like an apple_DEF”,则输出必须是“I like an apple”。
我尝试了以下代码,但它没有输出我所期望的。
re.compile("(?:ABC_|CDE_)*(\S+)(?:_DEF)?")
或
re.compile("(?:ABC_|CDE_)*(\S+)(?:_DEF)*")
非常感谢您的建议。
【问题讨论】:
你的目标是什么?请提供输入和输出的示例ANY_STRING
是与一个_
连接的两个字符串的块吗?还是只是anyStrIng
?一个现实生活中的例子会有所帮助。
@Wiktor ANY_STRING 表示任何字符串,如 \S+
它太笼统了,不能称它为任何字符串,任何字符串都可能像 ABC_CDE 一样最终是不需要的,如何区分需要什么,正则表达式是特定于要求的。必须有某种模式,例如 @ 或总是以 _A 等开头
@Inder “ABC_”或“CDE_”可以是前缀,“_DEF”可以是后缀。我想提取前缀和后缀之间的字符串。但它们可以存在也可以不存在。
【参考方案1】:
你可以使用
(?:ABC_|CDE_|^)+(\S*?)(?:_DEF|$)
见regex demo
详情
(?:
- 一个 non-capturing group 的开头,它匹配任何用 alternation operator |
分隔的子模式:
ABC_
- 文字子字符串 ABC_
|
- 或
CDE_
- 文字子字符串 CDE_
|
- 或
^
- 字符串开头
)+
- 一个或多个连续出现,尽可能多(+
是一个贪婪的量词)
(\S*?)
- 捕获组 1:零个或多个字符而不是空格,但由于 *?
惰性量词而尽可能少
(?:_DEF|$)
- _DEF
或 (|
) 字符串结尾 ($
)。
【讨论】:
这是什么 |例如在 ABC_|CDE_| 中的表达式?? @Inder|
是一个alternation operator。
@Wiktor 我能知道为什么 (?:ABC_|CDE_|^)+(\S*)(?:_DEF|$) 不能正常工作吗? “?”里面有东西吗?关键字使其工作?
@JoontaeKim \S*
(0+ 非空白字符) 是一个贪婪量化的模式,\S
匹配 _
、D
、E
和F
。因此,\S*
在此处抓取所有非空白字符直到字符串末尾,并检查 (?:_DEF|$)
是否可以匹配那里。是的,$
匹配字符串的结尾,因此第 1 组保存它抓取的所有文本,并且正则表达式引擎返回有效匹配。见this debugger page。
@Wiktor 我明白了。 “?”似乎有机会在不存在“\S*”的情况下检查“_DEF”。非常感谢!!以上是关于正则表达式最后删除不必要的字符串的主要内容,如果未能解决你的问题,请参考以下文章