【问题标题】:Python string replace character with regex [duplicate]Python字符串用正则表达式替换字符[重复]
【发布时间】:2020-11-26 23:13:53
【问题描述】:

我遇到了一个我不明白的正则表达式问题。我正在尝试用分号替换字符串之间的逗号,但它不起作用。下面是一个示例字符串。我设置了一个正则表达式来替换正则表达式非捕获组中“序列”之后的所有内容,因此末尾的逗号应该替换为非捕获组中唯一的子字符串,即分号。但是,它不起作用。当我将 (?:sequence:) 作为非捕获组时,它似乎只保留了任何字符串。只要我添加 \d,它就会替换整个东西。我不知道为什么。

在我真正的问题中,我有很多用冒号标记并以分号结尾的内容标签。在标签序列中,有一个错误的逗号而不是分号,我需要替换它,但保持一切不变。因此,解决方案应该只是将 sequence:2 更改为 sequence:2;

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?:sequence\:)(?:\d)(\,)", ";", a_string)

new_string

我查看了其他应该可以工作的solutions,但不要这样做。感谢您提供任何帮助,如果我可以更清楚地说明这个问题,请告诉我。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您可能打算在此处使用积极的消极回顾:

    a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
    new_string = re.sub(r"(?<=\bsequence:\d)(\,)", ";", a_string)
    
    print(new_string)
    

    打印出来:

    tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2; tag4: content4
    

    顺便说一句,如果您想直接匹配目标逗号前的sequence 文本,那很好,但也可以使用捕获组替换它:

    a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
    new_string = re.sub(r"(sequence:\d)(\,)", "\\1;", a_string)
    print(new_string)   # same as above
    

    【讨论】:

    • 感谢您的快速回复!你能帮我理解为什么我的解决方案不起作用吗?而且,为什么这种消极的向后看和 \b 呢?仍然让我对正则表达式有所了解,您似乎非常了解它。
    • 您当前的方法匹配并且消耗sequence:\d。这意味着您在替换过程中删除了此文本,但您只替换为一个逗号。我的第二个版本通过捕获序列文本来解决这个问题。第一个使用lookbehind的版本,匹配但使用文本。
    猜你喜欢
    • 1970-01-01
    • 2022-11-07
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2018-08-08
    • 2015-01-08
    相关资源
    最近更新 更多