正则表达式最后删除不必要的字符串

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 匹配 _DEF。因此,\S* 在此处抓取所有非空白字符直到字符串末尾,并检查 (?:_DEF|$) 是否可以匹配那里。是的,$ 匹配字符串的结尾,因此第 1 组保存它抓取的所有文本,并且正则表达式引擎返回有效匹配。见this debugger page。 @Wiktor 我明白了。 “?”似乎有机会在不存在“\S*”的情况下检查“_DEF”。非常感谢!!

以上是关于正则表达式最后删除不必要的字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 在最终出现 @ 之前删除特定字符

Java中的正则表达式-删除不必要的空格[重复]

在 presto 中使用正则表达式仅在最后一个斜杠前面有一个字符时才删除它

正则表达式替换以删除 html 标记之间的空格

使用正则表达式通过 PHP 缩小 JS

正则表达式替换但忽略最后一个字符