ide*_*n42 6 python regex regexp-replace
使用re
模块可以对替换模式使用转义。例如:
def my_replace(string, src, dst):
import re
return re.sub(re.escape(src), dst, string)
Run Code Online (Sandbox Code Playgroud)
虽然这适用于大多数情况,但dst
字符串可能包括"\\9"
例如。
这会导致一个问题:
\\1
, \\2
... 等dst
,文字将被解释为组。re.escape(dst)
原因.
更改为\.
.有没有办法在不引入多余字符转义的情况下转义目的地?
用法示例:
>>> my_replace("My Foo", "Foo", "Bar")
'My Bar'
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。
>>> my_replace("My Foo", "Foo", "Bar\\Baz")
...
re.error: bad escape \B at position 3
Run Code Online (Sandbox Code Playgroud)
这试图解释\B
为具有特殊含义。
>>> my_replace("My Foo", "Foo", re.escape("Bar\\Baz"))
'My Bar\\Baz'
Run Code Online (Sandbox Code Playgroud)
作品!
>>> my_replace("My Foo", "Foo", re.escape("Bar\\Baz."))
'My Bar\\Baz\\.'
Run Code Online (Sandbox Code Playgroud)
.
当我们不想要的时候,它就逃脱了。
虽然在这种情况下str.replace
可以使用,但关于目标字符串的问题仍然有用,因为有时我们可能想要使用其他功能,re.sub
例如忽略大小写的能力。
在这种情况下,只有反斜杠被解释为特殊字符,因此re.escape
您可以在目标参数中使用简单的替换来代替 。
def my_replace(string, src, dst):
import re
return re.sub(re.escape(src), dst.replace("\\", "\\\\"), string)
Run Code Online (Sandbox Code Playgroud)
如果您只是删除该代码,您的代码可以正常工作re.escape
,我不确定为什么我们会这样做:
import re
def my_replace(src, dst, string):
return re.sub(src, dst, string)
string = 'abbbbbb'
src = r'(ab)b+'
dst = r'\1z'
print(my_replace(src, dst, string))
Run Code Online (Sandbox Code Playgroud)
abz
Run Code Online (Sandbox Code Playgroud)
import re
def my_replace(src, dst, string):
return re.sub(src, dst, string)
string = re.escape("abbbbbbBar\\Baz")
src = r'(ab)b+'
dst = r'\1z'
print(my_replace(src, dst, string))
Run Code Online (Sandbox Code Playgroud)
abzBar\Baz
Run Code Online (Sandbox Code Playgroud)
import re
def my_replace(src, dst, string):
return re.sub(src, dst, string)
string = re.escape("abbbbbbBar\\Baz")
src = r'(ab)b+'
dst = r'\1' + re.escape('\\z')
print(my_replace(src, dst, string))
Run Code Online (Sandbox Code Playgroud)
ab\zBar\\Baz
Run Code Online (Sandbox Code Playgroud)
要构造dst
,我们必须首先知道是否要用任何捕获组替换字符串,例如\1
本例中的情况。我们不能re.escape
\1
,否则我们将用 替换我们的字符串\\1
,我们必须构造替换,如果有捕获组,然后将其附加到需要重新转义的任何其他部分。
import re
def my_replace(src, dst, string):
return re.sub(src, dst, string)
string = re.escape("abbbbbbBar\\Baz")
src = r'(ab)b+'
dst = r'\1' + re.escape('\9z')
print(my_replace(src, dst, string))
Run Code Online (Sandbox Code Playgroud)
ab\9zBar\\Baz
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1005 次 |
最近记录: |