Unicode re.sub()不适用于\ g< 0> (第0组)

时间:2013-10-17 13:04:28

标签: python regex string unicode regex-group

为什么\g<0>不能使用unicode正则表达式?

当我尝试使用\g<0>在具有普通字符串正则表达式的组之前和之后插入空格时,它可以正常工作:

>>> punct = """,.:;!@#$%^&*(){}{}|\/?><"'"""
>>> rx = re.compile('[%s]' % re.escape(punct))
>>> text = '''"anständig"'''
>>> rx.sub(r" \g<0> ",text)
' " anst\xc3\xa4ndig " '
>>> print rx.sub(r" \g<0> ",text)
 " anständig " 

但是使用unicode正则表达式时,不会添加空格:

>>> punct = u""",–−—’‘‚”“‟„!£"%$'&)(+*-€/.±°´·¸;:=<?>@§#¡•[˚]»_^`≤…\«¿¨{}|"""
>>> rx = re.compile("["+"".join(punct)+"]", re.UNICODE)
>>> text = """„anständig“"""
>>> rx.sub(ur" \g<0> ", text)
'\xe2\x80\x9eanst\xc3\xa4ndig\xe2\x80\x9c'
>>> print rx.sub(ur" \g<0> ", text)
„anständig“
  1. 如何让\g在unicode正则表达式中工作?
  2. 如果无法使用(1),如何让unicode正则表达式输入punct中字符前后的空格?

1 个答案:

答案 0 :(得分:1)

我认为你有两个错误。首先,您没有像使用punct的第一个示例中那样转发re.escape,并且您需要转义[]之类的字符。第二,text变量不是unicode。有效的例子:

>>> punct = re.escape(u""",–−—’‘‚”“‟„!£"%$'&)(+*-€/.±°´·¸;:=<?>@§#¡•[˚]»_^`≤…\«¿¨{}|""")
>>> rx = re.compile("["+"".join(punct)+"]", re.UNICODE)
>>> text = u"""„anständig“"""
>>> print rx.sub(ur" \g<0> ", text)
 „ anständig “