【问题标题】:Regex replacing pairs of dollar signs正则表达式替换成对的美元符号
【发布时间】:2016-07-28 19:30:58
【问题描述】:

我有一个类似的字符串:The old man $went$ to the $barn$. 我如何将其转换为The old man ~!went! to the ~!barn!.

如果我不需要在第一次出现的前面添加~,我可以在 Python 中简单地执行text.replace('$', '!')

【问题讨论】:

  • re.sub(r'\$(\w+)\$', r'~!\1!', s)
  • 或者另一个只匹配在单词边界内的美元:re.sub(r'\$\b([^$]+)\b\$', r'~!\1!', s)。它们中的任何一个或以下任何答案对您有用吗?

标签: python regex


【解决方案1】:

使用捕获组,以便您的替换字符串可以将 $ 之间的文本放回原处。

所以正则表达式是:

\$([^$]*)\$

然后替换字符串将是:

~!\1!

Regex101 Demo

【讨论】:

  • 澄清一下,使用.*?[^$]* 的区别在于第一个是“懒惰”,第二个是“贪婪”。贪婪量词更快,因为它们不需要尝试匹配每个字符的正则表达式的其余部分。 (12 步 vs 28 步)
【解决方案2】:

是的,正则表达式。捕获组会有所帮助。

result = re.sub(r'\$(.*?)\$', r'~!\1!', my_str)

【讨论】:

  • 美元符号没有转义。
  • @Ramen 对不起!
【解决方案3】:

可能正则表达式捕获组是要走的路,但这里有一个简单的方法来做到这一点,而无需正则表达式:

>>> s
'The old man $went$ to the $barn$'
>>> r
''
>>> seen = False
>>> 
>>> for c in s:
        if c=='$':
            if seen:
                r +='!'
                seen = False
            else:
                r +='~!'
                seen=True
        else:
            r += c


>>> r
'The old man ~!went! to the ~!barn!'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多