python的正确字符串文本是什么回复sub替换?

2024-04-18 23:37:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我不理解python正则表达式在正则表达式替换中插入Unicode字符时出现的错误。下面是简化的例子。你知道吗

根据documentation,repl参数应该是r''字符串。但是如果我对替换参数使用Unicode转义序列,那么我会得到一个KeyError。在搜索模式中使用它是很好的。你知道吗

我希望了解这个错误消息告诉我什么,以便更好地选择何时使用r''''作为替换模式。感谢您的帮助。你知道吗

Python 3.7.3 (default, Mar 27 2019, 09:23:15) 
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Python shell history and tab completion are enabled.
>>> import re
>>> re.sub(r'"', r'\u201c', '"Quoted String"')
Traceback (most recent call last):
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/sre_parse.py", line 1021, in parse_template
    this = chr(ESCAPES[this][1])
KeyError: '\\u'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/re.py", line 192, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/re.py", line 309, in _subx
    template = _compile_repl(template, pattern)
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/re.py", line 300, in _compile_repl
    return sre_parse.parse_template(repl, pattern)
  File "/Users/rgant/.local/share/virtualenvs/app-backend-09-_IN13/lib/python3.7/sre_parse.py", line 1024, in parse_template
    raise s.error('bad escape %s' % this, len(this))
re.error: bad escape \u at position 0
>>> re.sub(r'"(.*)"', '\u201c\\1\u201d', '"Quoted String"')
'“Quoted String”'
>>> re.sub(r'"(.*)"', r'\1', '"Quoted String"')
'Quoted String'
>>> re.sub(r'\u201c', '!', '“Quoted String”')
'!Quoted String”'
>>> re.sub(r'\u201c(.*)\u201d', r'"\1"', '“Quoted String”')
'"Quoted String"'
>>> r'\u201c(.*)\u201d'
'\\u201c(.*)\\u201d'
>>> r'"\1"'
'"\\1"'
>>> r'\u201c'
'\\u201c'
>>> r'\u201c\1\u201d'
'\\u201c\\1\\u201d'
>>>

Tags: inresharestringparselocallinevirtualenvs
1条回答
网友
1楼 · 发布于 2024-04-18 23:37:50

r''字符串使反斜杠成为反斜杠。所以r"\u201c"有六个字符:\u201c。然后正则表达式引擎看着这些字符并抱怨说,“我不知道反斜杠-u是什么意思!”你知道吗

所以在这种情况下,您不希望使用r字符串替换regex,因为您需要反斜杠来引入unicode转义。如果没有r前缀,则只有一个字符串:"\u201c"包含字符\u201c,或一个卷曲引号。你知道吗

如您所示,如果没有r前缀,则替换可以正常工作:

>>> re.sub(r'"(.*)"', '\u201c\\1\u201d', '"Quoted String"')
'“Quoted String”'

相关问题 更多 >