[英]Replacing unicode brackets in python
如何用空格填充Unicode括号?
当我尝试使用re.sub
,出现sre_constants.error
:
>>> import re
>>> open_punct = ur'([{༺༼᚛‚„⁅⁽₍〈❨❪❬❮❰❲❴⟅⟦⟨⟪⟬⟮⦃⦅⦇⦉⦋⦍⦏⦑⦓⦕⦗⧘⧚⧼⸢⸤⸦⸨〈《「『【〔〖〘〚〝﴾︗︵︷︹︻︽︿﹁﹃﹇﹙﹛﹝([{⦅「'
>>> text = u'this is a weird ❴sentence ⟅with some crazy ⟦punctuations sprinkled⟨'
>>> re.sub(open_punct, ur'\1 ', text)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/re.py", line 155, in sub
return _compile(pattern, flags).sub(repl, string, count)
File "/usr/lib/python2.7/re.py", line 251, in _compile
raise error, v # invalid expression
sre_constants.error: unexpected end of regular expression
为什么会这样呢? 为什么正则表达式意外结束?
当我尝试使用re.escape
,它不会引发错误,但是re.sub
并没有用空格填充标点符号:
>>> re.sub(re.escape(open_punct), ur'\1 ', text)
u'this is a weird \u2774sentence \u27c5with some crazy \u27e6punctuations sprinkled\u27e8'
>>> print re.sub(re.escape(open_punct), ur'\1 ', text)
this is a weird ❴sentence ⟅with some crazy ⟦punctuations sprinkled⟨
我可以这样做,但我希望正则表达式解决方案比循环更优化:
>>> for p in open_punct:
... text = text.replace(p, p+' ')
...
>>> text
u'this is a weird \u2774 sentence \u27c5 with some crazy \u27e6 punctuations sprinkled\u27e8 '
>>> print text
this is a weird ❴ sentence ⟅ with some crazy ⟦ punctuations sprinkled⟨
>>> open_punct
u'([{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2329\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62'
>>> print open_punct
([{༺༼᚛‚„⁅⁽₍〈❨❪❬❮❰❲❴⟅⟦⟨⟪⟬⟮⦃⦅⦇⦉⦋⦍⦏⦑⦓⦕⦗⧘⧚⧼⸢⸤⸦⸨〈《「『【〔〖〘〚〝﴾︗︵︷︹︻︽︿﹁﹃﹇﹙﹛﹝([{⦅「
相关问题:
[
和(
在正则表达式中具有特殊含义,解析器正在寻找它们的]
和)
对应项。
如果open_punct
设为字符组 ,则无论如何都将所有字符都用[..]
括起来,这时(
和[
都可以不转义包括在内。您的'表达式'仅匹配文本中所有这些字符该订单存在。
由于您还希望引用捕获组( \\1
),因此添加paretheses:
>>> re.sub(u'([{}])'.format(open_punct), ur'\1 ', text)
u'this is a weird \u2774 sentence \u27c5 with some crazy \u27e6 punctuations sprinkled\u27e8 '
>>> print re.sub(u'([{}])'.format(open_punct), ur'\1 ', text)
this is a weird ❴ sentence ⟅ with some crazy ⟦ punctuations sprinkled⟨
请注意,如果您要与之匹配的组中有-
或]
字符或\\[group]
序列,则使用re.escape()
仍然是一个好主意。 -
定义字符序列(所有数字为0-9
), ]
组的末尾和\\d
, \\w
, \\s
等,均定义了预定义的字符组:
re.sub(u'([{}])'.format(re.escape(open_punct)), ur'\1 ', text)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.