Python - 正则表达式 - 特殊字符和ñ

Nac*_*uel 8 python regex unicode

我有这个脚本来测试正则表达式以及unicode的行为:

# -*- coding: utf-8 -*-
import re

p = "Solo voy si se sucedierón o se suceden mañana los siguienñes eventos:"

w = re.findall('[a-zA-ZÑñ]+',p.decode('utf-8'), re.UNICODE)

print(w)
Run Code Online (Sandbox Code Playgroud)

而且print语句显示如下:

[u'Solo', u'voy', u'si', u'se', u'sucedier', u'n', u'o', u'se', u'suceden', u'ma', u'ana', u'los', u'siguien', u'es', u'eventos']
Run Code Online (Sandbox Code Playgroud)

"sucedierón"正在转变为"u'sucedier', u'n'",并同样"mañana" 成为"u'ma', u'ana'".

我试过解码,添加'\xc3\xb1a'到正则表达式'Ñ'

在阅读了一些文档后,我意识到使用[a-zA-Z]只匹配ASCII字符.这就是为什么我必须改为,r'\b\w+\b'所以我可以为正则表达式添加标志

w = re.findall(r'\b\w+\b', p, re.UNICODE) 
Run Code Online (Sandbox Code Playgroud)

但这没效果.

我也试过decode()第一次和findall()后来:

p = "Solo voy si se sucedierón o se suceden mañana los siguienñes eventos:"
U = p.decode('utf8')
Run Code Online (Sandbox Code Playgroud)

如果我打印变量 U

"Solo voy si se sucedierón o se suceden mañana los siguienñes eventos:"
Run Code Online (Sandbox Code Playgroud)

我看到输出是预期的,但是当我findall()再次使用时:

[u'Solo', u'voy', u'si', u'se', u'sucedier\xf3n', u'o', u'se', u'suceden', u'ma\xf1ana', u'los', u'siguien\xf1es', u'eventos']
Run Code Online (Sandbox Code Playgroud)

现在,这个词是完整的,但ó被替换\xf3nñ替换\xf1,Unicode值.

我怎样才能findall()获得非ASCII字符"ñ","á", "é", "í", "ó", "ú"

我现在有很多这样的问题,相信我,我读了很多,但我找不到丢失的部分.

编辑

我正在使用python 2.7

编辑2 其他人可以试试@LetzerWille建议的吗?不适合我

Mar*_*ano 4

Python 中带有重音字符(变音符号)的正则表达式

\n\n

re.UNICODE标志允许您使用带有变音符号(重音符号和波形符)的单词字符\\w和单词边界\\b。这对于匹配不同语言的单词非常有用。

\n\n
    \n
  1. 将文本从 UTF-8 解码为
  2. \n
  3. 确保模式和主题文本作为传递给正则表达式函数。
  4. \n
  5. 结果是一个字节数组,可以循环/映射以再次编码回 UTF-8
  6. \n
  7. 打印数组会显示转义的非 ASCII 字节,但独立打印每个字符串是安全的。
  8. \n
\n\n

代码:

\n\n
# -*- coding: utf-8 -*-\n# http://stackoverflow.com/q/32872917/5290909\n#python 2.7.9\n\nimport re\n\ntext = "Solo voy si se sucedier\xc3\xb3n o se suceden ma\xc3\xb1ana los siguien\xc3\xb1es eventos:"\n# Decode to unicode\nunicode_text = text.decode(\'utf8\')\n\nmatches = re.findall(ur\'\\b\\w+\\b\', unicode_text, re.UNICODE)\n\n# Encode back again to UTF-8\nutf8_matches = [ match.encode(\'utf-8\') for match in matches ]\n\n# Print every word\nfor utf8_word in utf8_matches:\n    print utf8_word\n
Run Code Online (Sandbox Code Playgroud)\n\n

ideone Demo

\n