[英]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#'
首先,不需要轉義字符類中的每個“魔法”字符, [$#%!\\s]*
同樣好,可讀性更高。
其次,匹配(即檢索)與替換不同,您可以使用反向引用來實現您的目標。
第三,如果你只想在結尾加上#
,你可以用更簡單的表達方式來幫助自己:
(?:[\\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.