在Python的正则表达式模式中使用变量

2024-05-23 22:50:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图对波斯语文本文件进行预处理,但问题是,对于数字,有时他们使用阿拉伯数字而不是波斯语数字。我想用正则表达式解决这个问题。以下是我的代码片段:

def preprocessing(content):
    import re
    for d in range(10):
        arabic_digit = rf"\u066{d}"
        persian_digit = rf"\u06F{d}"
        content = re.sub(arabic_digit, persian_digit, content)
    return(content)

但它给出了以下错误信息:

error: bad escape \u at position 0

我想知道如何在正则表达式模式中使用变量。奇怪的是,第二个模式(persian_digit)存在问题,当我将其更改为静态字符串时,没有错误。谢谢你抽出时间


Tags: 代码inimportrefordef模式数字
2条回答

根据this,在re.sub()中包含“\”的模式中不允许有未知转义,这是您遇到的错误

您可以做的是将原始字符串返回到像this这样的“正常”字符串,但我不确定这是否是最佳实践:

import codecs
import re

def preprocessing(content):
    for d in range(10):
        arabic_digit = codecs.decode(rf"\u066{d}", 'unicode_escape')
        persian_digit = codecs.decode(rf"\u06F{d}", 'unicode_escape')
        content = re.sub(arabic_digit, persian_digit, content)
    return content

chr()是生成Unicode代码点的方法:

def preprocessing(content):
    import re
    for d in range(10):
        arabic_digit = chr(0x660 + d)
        persian_digit = chr(0x6f0 + d)
        content = re.sub(arabic_digit, persian_digit, content)
    return content

但是,str有一个内置的.translate函数,用于进行更有效的大规模替换。给出要替换的字符列表和相同长度的新字符列表:

arabic_digits = ''.join([chr(i) for i in range(0x660,0x66a)])
persian_digits = ''.join([chr(i) for i in range(0x6f0,0x6fa)])
print('Arabic: ',arabic_digits)
print('Persian:',persian_digits)

# compute the translation table once
_xlat = str.maketrans(arabic_digits,persian_digits)

def preprocessing(content):
    return content.translate(_xlat)

test = '4\u06645\u06656\u0666'

print('before:',test)
print('after: ',preprocessing(test))

输出:

Arabic:  ٠١٢٣٤٥٦٧٨٩
Persian: ۰۱۲۳۴۵۶۷۸۹
before: 4٤5٥6٦
after:  4۴5۵6۶

相关问题 更多 >