【问题标题】:Extracting the text after the initial substrings between square brackets在方括号之间的初始子字符串之后提取文本
【发布时间】:2020-12-11 12:03:34
【问题描述】:

我想从字符串中提取子串,比如

案例一:

text = "some_txt" # → some_txt

案例2:

text = "[info1]some_txt" #  → some_txt

案例3:

text = "[info1][info2] some_text" # → some_txt

案例4:

text = "[info1][info2] some_text_with_[___]_abc" # → some_text_with_[___]_abc

我做的是

match = re.search("^\[.+\] (.*)", text)
   if match:
   result = match.group(1)

除了第 4 种情况,它工作正常,它只给出abc。我想改用some_text_with_[___]_abc

任何帮助将不胜感激。

【问题讨论】:

  • 看起来你想要r"^(?:\[[^][]+])+\s*(.*)",对吧?或者,只是re.sub(r'^(?:\[[^][]+])+\s*', '', text)。请注意,使用内置函数作为变量名并不是一个好主意。请说明您的要求是什么,因为“我坚持使用 python 正则表达式”不是很有帮助。
  • 是的。有用。非常感谢您的帮助。但这对我来说很难理解。是否可以解释这种正则表达式模式?
  • 请确认我的编辑没问题。
  • 您的编辑非常好。非常感谢。我应该自己做的。 :D
  • 请注意,量化具有单一强制性模式和所有其他可选模式的组并不是一个好主意,这会导致性能问题和灾难性的回溯。

标签: python regex python-re


【解决方案1】:

使用您当前的代码,您可以使用

r"^(?:\[[^][]+](?:\s*\[[^][]+])*)?\s*(.*)"

请参阅regex demo

如果您实际上对是否匹配不感兴趣,您可以使用re.sub 从字符串的开头删除这些括号内的子字符串

re.sub(r'^\[[^][]+](?:\s*\[[^][]+])*\s*', '', text)

another regex demo

正则表达式详细信息

  • ^ - 字符串开头
  • (?:\[[^][]+](?:\s*\[[^][]+])*)? - 可选出现
    • \[[^][]+] - 一个[,然后是除[] 之外的任何一个或多个字符,然后是]
    • (?:\s*\[[^][]+])* - 零次或多次出现零个或多个空格,然后是[,然后是除[] 之外的任何一个或多个字符,尽可能多地出现]
  • \s* - 零个或多个空格
  • (.*) - 第 1 组:除换行符之外的任何零个或多个字符,尽可能多。

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 2018-02-07
    • 2020-01-26
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2016-08-30
    相关资源
    最近更新 更多