【问题标题】:Regular expression to remove unnecessary string at last正则表达式最后删除不必要的字符串
【发布时间】:2018-07-24 07:40:03
【问题描述】:

假设我们有:

  1. ABC_ANY_STRING_DEF
  2. ANY_STRING
  3. ANY_STRING_DEF
  4. 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”可以是后缀。我想提取前缀和后缀之间的字符串。但它们可以存在也可以不存在。

标签: python regex python-2.7


【解决方案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”。非常感谢!!
猜你喜欢
  • 2013-04-28
  • 2018-03-06
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2011-02-28
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多