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

using variables inside regex patterns in 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) 上,当我将其更改为静态字符串时,没有任何错误。谢谢你的时间。

根据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۶