3

\g<0>ユニコード正規表現で動作しないのはなぜですか?

\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. \gUnicode 正規表現で作業するにはどうすればよいですか?
  2. (1) が不可能な場合、文字の前後にスペースを入力する Unicode 正規表現を取得するにはどうすればよいpunctですか?
4

1 に答える 1

1

2つのエラーがあると思います。まず、punct最初の例のようにエスケープしておらず、そのre.escapeような文字を[]エスケープする必要があります。第二に、text変数はユニコードではありません。動作する例:

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