繁体   English   中英

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

[英]Python - regex - special characters and ñ

我有这个脚本来测试正则表达式以及 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)

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']

"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) 

但这没有用。

我也尝试先decode()然后再findall()

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

如果我打印变量U

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

我看到输出符合预期,但是当我再次使用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']

现在这个词是完整的,但是ó被替换为\\xf3n并且ñ被替换为\\xf1 ,unicode 值。

如何findall()并获取非 ASCII 字符"ñ","á", "é", "í", "ó", "ú"

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

编辑

我正在使用 python 2.7

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

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

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

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

代码:

# -*- coding: utf-8 -*-
# http://stackoverflow.com/q/32872917/5290909
#python 2.7.9

import re

text = "Solo voy si se sucedierón o se suceden mañana los siguienñes eventos:"
# Decode to unicode
unicode_text = text.decode('utf8')

matches = re.findall(ur'\b\w+\b', unicode_text, re.UNICODE)

# Encode back again to UTF-8
utf8_matches = [ match.encode('utf-8') for match in matches ]

# Print every word
for utf8_word in utf8_matches:
    print utf8_word

ideone 演示

你的代码应该写成:

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

请自行将其他字符添加到字符类中,因为我不知道您要匹配的完整字符集。

处理 Unicode 文本时,请确保输入字符串和模式均为unicode 1类型。

1 unicode在逻辑上是一组 UTF-16 代码单元(窄版本)或 UTF-32 代码单元/代码点(宽版本)。 如果您打算使用 Python 处理 Unicode 文本,为了避免在窄版本中出现星体平面字符的问题,我建议使用 Python 3.3 及更高版本,或者始终使用其他版本的宽版本。

在 Python 2 中, str只是一个 bytes 数组,因此模式中 ASCII 范围之外的字符将被简单地解释为在源编码中构成该字符的字节序列:

>>> [i for i in '[a-zA-ZÑñ]+']
['[', 'a', '-', 'z', 'A', '-', 'Z', '\xc3', '\x91', '\xc3', '\xb1', ']', '+']  

编译strunicode对象时比较re.DEBUG输出:

>>> re.compile('[a-zA-ZÑñ]+', re.DEBUG)
max_repeat 1 4294967295
  in
    range (97, 122)
    range (65, 90)
    literal 195      # \xc3
    literal 145      # \x91
    literal 195
    literal 177
<_sre.SRE_Pattern object at 0x6fffffd0dd8>

>>> re.compile(u'[a-zA-ZÑñ]+', re.DEBUG)
max_repeat 1 4294967295
  in
    range (97, 122)
    range (65, 90)
    literal 209      # Ñ
    literal 241      # ñ
<_sre.SRE_Pattern object at 0x6ffffded030>

由于您没有使用\\s\\w\\d ,因此re.UNICODE标志无效并且可以删除。

这个对我有用。 我使用 Pycharm,并将控制台设置为 utf-8。

您需要将输出控制台配置为 utf-8 ....

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

w = re.findall('ñ',p, re.UNICODE)

print(w)

['ñ', 'ñ']

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

print(w)

['Solo', 'voy', 'si', 'se', 'sucedierón', 'o', 'se', 'suceden', 'mañana', 'los', 'siguienñes', 'eventos:']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM