【问题标题】:How to substitute a regex with another regex in a string如何用字符串中的另一个正则表达式替换一个正则表达式
【发布时间】:2019-08-20 03:13:51
【问题描述】:

这个question 展示了如何替换一个正则表达式与另一个像这样的正则表达式

$string = '"SIP/1037-00000014","SIP/CL-00000015","Dial","SIP/CL/61436523277,45"';
$$pattern = '["SIP/CL/(\d*),(\d*)",]';
$replacement = '"SIP/CL/\1|\2",';
$string = preg_replace($pattern, $replacement, $string);
print($string);

但是,我无法调整该模式来解决我想要删除两个单词之间但不是单词和数字之间的句号的情况:

text = 'this . is bad. Not . 820'
regex1 = r'(\w+)(\s\.\s)(\D+)'
regex2 = r'(\w+)(\s)(\D+)'
re.sub(regex1, regex2, text)

# Desired outcome:
'this is bad. Not . 820'

基本上我喜欢删除两个字母词之间的.。有人可以帮我解决这个问题吗?提前谢谢你。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    这些表达方式可能与您的想法很接近:

    \s[.](?=\s\D)
    

    (?<=\s)[.](?=\s\D)
    

    测试

    import re
    
    regex = r"\s[.](?=\s\D)"
    test_str = "this . is bad. Not . 820"
    print(re.sub(regex, "", test_str))
    

    输出

    this is bad. Not . 820
    

    如果您想探索/简化/修改表达式,它已经 在右上角的面板上进行了解释 regex101.com。如果你愿意,你 也可以在this link看,怎么搭配 针对一些样本输入。


    【讨论】:

    • 谢谢,艾玛。您的解决方案几乎是完美的。但是,我喜欢在 Not820 之间获得这个结果 this is bad. Not . 820
    【解决方案2】:

    首先,出于显而易见的原因,您不能真正将 PHP 直接应用到 Python。

    其次,当 API 发生变化时,指定您使用的 Python 版本总是有帮助的。幸运的是,在这种情况下,re.sub 的 API 在 Python 2.x 和 Python 3 之间保持不变。

    关于你的问题。

    re.sub 的第二个参数是字符串或函数。如果您传入regex2,它只会将regex1 替换为regex2 的字符串内容,它不会将regex2 作为正则表达式应用。

    如果您想使用从第一个正则表达式派生的组(类似于您的示例,它使用 \1 和 \2 从第一个正则表达式中提取第一个和第二个匹配组),那么您需要 @987654321 @,它将match object 作为其唯一参数,然后您可以使用它来提取匹配组并将它们作为替换字符串的一部分返回。

    【讨论】:

    • 谢谢,利亚姆。我不知道我依赖的示例代码是 PHP。我确实知道re.sub 的第二个参数必须是字符串或可调用的。但是示例代码(我认为是 Python)表明它可以完成,因此我的问题。
    猜你喜欢
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多