簡體   English   中英

為什么我不能使用 re.sub 來替換組?

[英]Why can I not use re.sub to replace a group?

我的目標是使用regex在字符串中找到一個組並將其替換為空格。

我正在尋找的組是一組符號,只有當它們落在字符串之間時。 當我使用re.findall()它完全按預期工作

word = 'This##Is # A # Test#'
print(word)
re.findall(r"[a-zA-Z\s]*([\$\#\%\!\s]*)[a-zA-Z]",word)
>>> ['##', '# ', '# ', '']

但是當我使用re.sub() ,它不是替換組,而是替換整個正則表達式。

x = re.sub(r"[a-zA-Z\s]*([\$\#\%\!\s]*)[a-zA-Z]",r' ',word)
print(x)
>>> '    #'

如何使用正則表達式僅替換組? 我期望的結果是:

'This Is A Test#'
  1. 首先,不需要轉義字符類中的每個“魔法”字符, [$#%!\\s]*同樣好,可讀性更高。

  2. 其次,匹配(即檢索)與替換不同,您可以使用反向引用來實現您的目標。

  3. 第三,如果你只想在結尾加上# ,你可以用更簡單的表達方式來幫助自己:

     (?:[\\s#](?!\\Z))+

    然后需要用空格替換,請參閱regex101.com 上的演示


    Python這可能是:

     import re string = "This##Is # A # Test#" rx = re.compile(r'(?:[\\s#](?!\\Z))+') new_string = rx.sub(' ', string) print(new_string) # This Is A Test#

您可以將要保留的模式部分分組,並在替換字符串中使用反向引用:

x = re.sub(r"([a-zA-Z\s]*)[\$\#\%\!\s]*([a-zA-Z])", r'\1 \2', word)

問題是您的正則表達式完全匹配錯誤的東西。

x = re.sub(r'\b[$#%!\s]+\b', ' ', word)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM