在 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۶
我正在尝试预处理波斯语文本文件,但问题是对于数字,有时他们使用阿拉伯数字而不是波斯数字。我想用正则表达式来解决这个问题。这是我的代码片段:
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۶