大家好,我是第一次发布此问题。我正在编写一个python脚本来制作一个程序,该程序将返回标准单词形式。我基于规则来转换历史文本(拼写标准化)。在这里,代码无法正常工作。它仅显示修改后的单词,而不显示整个文件。请问我如何解决的想法。
import re, string, unicodedata
from nltk.corpus import stopwords
import spacy
import codecs
nlp = spacy.load('fr')
with codecs.open(r'/home/m16/fatkab/RD_project/corpus.txt', encoding='utf8')as f:
word =f.read()
tokens = re.split(r'\W+', word)
print (tokens)
for word in tokens:
rule1 = word.replace('y', 'i')
# to avoid modifying y as a word itself:
if word.endswith ('y')and len(word) >= 2:
print(rule1)
我的样本输入:或pu que dieu est ainsi destutu 努斯,奎伊·卢伊·普莱德·努斯公报 ainsi sabonté©:n'est ce pas raison que nous souts du tout siens?等古怪的趋势 拉不勒斯主教堂 nous soyons儿子遗产,全数获得 比较一下? Le peuple donc s'il eust eu vn grain de prudence,deuoit bien se ranger en toutehumilité 倒入学说 普莱斯莫伊斯。 et mesme quelle权威 优异奖 tant de miracles?Car Dieu ne commande pas simplement 莫伊斯·德·帕勒(Moyse de parler) 先知给儿子倒:蒙蒂涅大区轮胎街, 阿芬省萨尔河畔孔加尼日报 Qu'on le劳埃德省万国城 tienne comme vn Ange和非点comne vne生物mortelle。
这是输出
lui
lui
lui
ai
oui
Loi
lui
foi
Loi
hui
soi
lui
lui
lui
ci
Loi
soi
lui
ai
lui
lui
doi
quoi
soi
ai
lui
lui
soi
# the language is French
答案 0 :(得分:2)
在整个文本上使用re.sub。
regex的主要优点是您可以跨大量文本运行规则-无需手动标记和重建输出。
import re
text = "ouy you are the best luy guy in the try"
sub_pattern = re.compile(r"y(\W+|$)")
print(re.sub(sub_pattern, r"i\1", text))
# oui you are the best lui gui in the tri
这里,我们使用re.sub
功能在整个文件中用替换替换模式的每个匹配项。
要保持行之间的间距-我们在替换模式中使用后向引用\1
。这会将匹配项中捕获组(1)中的文本添加回输出中。
正则表达式模式说明:
re.compile
-如果您反复使用相同的正则表达式,则只需对其进行一次编译即可节省计算机,而不必继续对其进行重新计算。在这种情况下,为了清楚起见,它仅用于将该正则表达式分隔到其自己的行中。
r"y(\W+|$)"
-r
告诉python将字符串视为原始字符串,即反斜杠不会错误地转义字符。要匹配字符串末尾的“ y”,规则是“后跟非单词字符或字符串($)末尾的'y'”。这是我们用来匹配输入中所有“不正确”“ y”结尾的模式。请注意,空格是在()
组中捕获的,因此我们以后可以在反向引用中使用它。
r"i\1"1
-首先,我们要按照您的规则用“ i”替换匹配的y +空格。然后,我们需要确保将空白放回原处-使用反向引用\1
进行操作,该反向引用将在模式(\W+|$)
中添加group1捕获的任何内容。
或者
与其捕获空白,不如将其替换并添加回去。我们还可以在原始模式中使用一个非捕获组-因此,我们仅捕获“ y”并将其替换。
为此,您可以使用模式:
sub_pattern = re.compile(r"y(?=\W+|$)")
print(re.sub(sub_pattern, r"i", text))
# oui you are the best lui gui in the tri
请注意,空格匹配模式现在以?=
开头,表示它是非捕获性超前。这意味着它将检查这些字符在“ y”之后是否存在,但是在替换过程中不会将其从字符串中删除。因此,替换只需用“ i”替换,因为空格不会被修改。