编写识别所有unicode字母的python正则表达式

时间:2013-11-22 00:48:59

标签: python regex unicode utf-8 decode

python中没有[\ p {Ll} \ p {Lo} \ 1,我正在努力编写一个识别unicode的正则表达式...并且不会混淆标点符号,例如当脚本遇到语音标记(如'ô'或'طس')时,' - '或添加有趣的变音符号。

我的目标是标记所有字母(ASCII和任何unicode)并返回“A”。数字[1-9]为9。

我目前的职能是:

def multiple_replace(myString):
    myString = re.sub(r'(?u)[^\W\d_]|-','A', myString)
    myString = re.sub(r'[0-9]', '9', myString)
    return myString

我得到的回报是(注意' - '被标记的方式的有效性......有时被称为'A'有时被称为'Aœ'):

TX 35-L | AA 99AA
М-21 | AAœA99
A 1 طس | A 9 A~˜A·A~AA
US-50 | AAA99
yeni sinop-erfelek yolu çevre yolu | AAAA AAAAAAAAAAAAA AAAA AƒA§AAAA AAAA
Av Antônio Ribeiro | AA AAAAƒA´AAA AAAAAAA

我需要得到的是:

TX 35-L | AA 99-A
М-21 | A-99
A 1 طس | A 9 AAAAA
US-50 | AA-99
yeni sinop-erfelek yolu çevre yolu | AAAA AAAAAAAAAAAAA AAAA AAAAAAAA AAAA
Av Antônio Ribeiro | AA AAAAAAAAAA AAAAAAA

...甚至可以(使用python re 2.7)通常识别所有不是常见标点符号的UTF-8字符(即'()',',','。',' - '等)而不是没有[\ p {Ll} \ p {Lo} \的1-9号码?

2 个答案:

答案 0 :(得分:2)

如果使用Python 2.7,请使用Unicode字符串。我假设您的“我需要的”示例不正确,或者您真的想要AAAAA طس吗?如果从文件中读取字符串,请先将字符串解码为Unicode。

#!python2
#coding: utf8
import re

# Note leading u
data = u'TX 35-L|М-21|A 1 طس|US-50|yeni sinop-erfelek yolu çevre yolu|Av Antônio Ribeiro'.split('|')

for d in data:
    r = re.sub(ur'(?u)[^\W\d_]',u'A', d)
    r = re.sub(ur'[0-9]', u'9', r)
    print d
    print r
    print

输出:

TX 35-L
AA 99-A

М-21
A-99

A 1 طس
A 9 AA

US-50
AA-99

yeni sinop-erfelek yolu çevre yolu
AAAA AAAAA-AAAAAAA AAAA AAAAA AAAA

Av Antônio Ribeiro
AA AAAAAAA AAAAAAA

答案 1 :(得分:-2)

不确定为什么我的答案被删除了,但这是我出去的:

功能(正则表达式):

def multiple_replace(myString):
    myString = re.sub(ur'(?u)[^\W\d_]', u'A', myString)
    myString = re.sub(ur'[0-9]', u'9', myString)
    return myString

呼叫(带解码):

with codecs.open(r'test5.txt', 'w', 'utf-8') as outfile1:
    for row in reader:
        unicode_row = [x.decode('utf-8') for x in row]
        item = unicode_row[csv_col_index]
        outfile1.write(row[1] + "," + item + "," + multiple_replace(item) + "\n")