【问题标题】:How do I write a regex to replace a word but keep its case in Python?如何编写正则表达式来替换单词但在 Python 中保持大小写?
【发布时间】:2012-07-01 19:28:36
【问题描述】:

这可能吗?

基本上,我想把这两个对 sub 的调用变成一个调用:

re.sub(r'\bAword\b', 'Bword', mystring)
re.sub(r'\baword\b', 'bword', mystring)

我真正想要的是某种条件替换符号,例如:

re.sub(r'\b([Aa])word\b', '(?1=A:B,a:b)word')

我只关心第一个字符的大小写。其他都没有。

【问题讨论】:

  • 如果您使用替换功能,您可以对替换值执行“高级操作”。请参阅re.sub,其中说“repl 可以是字符串或函数”。
  • 你必须描述你的目标词的形式。例如,它是否总是一个连续的字符串,其中只更改第一个字符的大小写?
  • 好的,看看替换函数,虽然我觉得在正则表达式方面这是作弊:(
  • 这不是作弊。你想要有条件的替换。正则表达式正在完成匹配和捕获您的模式的工作。但是你想要的是在决定更换它之前先检查一下reault。
  • 我知道正则表达式很酷,但是如果你的用法真的这么简单,我会避免使用它们...对于正则表达式,“强大的力量,带来巨大的默默无闻”...

标签: python regex


【解决方案1】:

使用捕获组 (r'\1'):

 re.sub(r'\b([Aa])word\b', r'\1word', "hello Aword")

【讨论】:

  • 我想用不同的字母代替。即,我希望结果是“Bword”,而不是“Aword”。
【解决方案2】:

好的,这就是我想出的解决方案,感谢使用替换功能的建议。

re.sub(r'\b[Aa]word\b', lambda x: ('B' if x.group()[0].isupper() else 'b') + 'word', 'Aword  aword.')

【讨论】:

    【解决方案3】:

    您可以传递一个使用 Match 对象作为参数的 lambda 函数作为替换函数:

    import re
    re.sub(r'\baword\b', 
           lambda m: m.group(0)[0].lower() == m.group(0)[0] and 'bword' or 'Bword',
           'Aword aword', 
           flags=re.I)
    # returns: 'Bword bword'
    

    【讨论】:

    • a and b or c 已经过时了——使用b if a else c
    【解决方案4】:

    您可以使用函数来解析每个匹配项:

    >>> def f(match):
            return chr(ord(match.group(0)[0]) + 1) + match.group(0)[1:]
    
    >>> re.sub(r'\b[aA]word\b', f, 'aword Aword')
    'bword Bword'
    

    【讨论】:

    • @ConleyOwens 我这样做是因为它可以使用 [xX]any_word 形式的不同表达式:)
    • 这是一个可爱的答案,但它只适用于替换 'a' -> 'b' 和 'A' -> 'B'
    • @tel 因为这是原始问题中指定的内容。如果你很聪明,你可以调整这个答案来处理你喜欢的任何字母,而不是投反对票。您只需将匹配的正则表达式更改为 [aA] 到其他类似 \w
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多