【问题标题】:Using regex, get a string after a character, special case使用正则表达式,获取字符后的字符串,特殊情况
【发布时间】:2019-04-01 20:44:15
【问题描述】:

我正在使用 python 和正则表达式来读取文件并获取字符 (/) 之后的字符串列表。

例如:

text = "Youngblood /Pop Midnight/R&B Thunder/Rock"
re.findall(r'/([^\s]+)', text)

会回来

['Pop', 'R&B', 'Rock']

现在,假设是否存在子字符串中有两个字符“/”的特殊情况,

abc\/def/this

abc\/def\/ghi/this

正则表达式将无法正常工作(如我所愿)并返回“def/this”或“def/ghi/this”。

正确的输出是“this”。如何修复正则表达式以处理这种特殊情况?

【问题讨论】:

  • 特殊情况的正确输出应该是什么?我很困惑。
  • 字符串之间总是有空格吗?比如 Midnight/R&B 'space' Thunder/Rock 等。
  • @RaoslawSzamszur 我编辑了这个问题。我只想获取最后一个 '/' 之后的字符串
  • @RaoslawSzamszur 总是有一个空格,每个子字符串都需要应用正则表达式。

标签: python regex string


【解决方案1】:
re.findall(r'/([^\s/]+(?!\S))', text)

返回

['Pop', 'R&B', 'Rock', 'ghj']

您需要先行,因为您想在比赛结束后检查角色。您不能使用(?=\s)(它将与空格匹配),因为这样会跳过最后一项。 (?!\S) 表示 not not 一个空格,它匹配一个空格但也匹配字符串结尾。

【讨论】:

    【解决方案2】:

    如果字符串之间总是有空格,即使没有正则表达式也可以做到。

    text = "Youngblood/Pop Midnight/R&B Thunder/Rock abc/def/ghj"
    output = []
    
    for item in text.split(" "):
        output.append(item.split("/")[-1])
    

    输出:

    ['Pop', 'R&B', 'Rock', 'ghj']
    

    【讨论】:

      【解决方案3】:

      如果您不打算使用 all regex 来完成确切的目的,则可以将已有的内容与此列表理解结合起来:

      targets = [e.split('/')[-1] for e in re.findall('/([^\s]+)', text)]
      

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 2017-07-16
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        相关资源
        最近更新 更多