法语正则表达式

1 投票
1 回答
1321 浏览
提问于 2025-04-18 15:45

我有一个法语的正则表达式,上面有一些重音符号。

我有一本打印出来的字典(不是Python的数据结构),里面是用大写字母写的单词,后面跟着它们的定义。我想把我的20MB字典按照所有的大写单词进行拆分。

问题在于,有些单词本身是由多个词组成的:我需要根据大写字母的组合来拆分文本,不管中间有没有空格。此外,这些单词可能还包含带重音的字符。

我花了一整天的时间想要实现这个,但一直找不到解决办法。

这里有一个例子:

# -*- coding: utf-8 -*-
import codecs
import re
import string
print "debut pgm"
import regex



dico = """ARRHEMENT. s. m. L'action d'arrher. Achat de grains en vert et sur pied. ARRHER.v. a. S'assurer de quelque chose en donnant des arrhes. Arrher des marchandises.
Arrhé, ée. participe. ARRHES. s. f. pl. L'argent qu'on donne pour assurance de l'exécution d'un marché, et que l'on perd si lemarché n'a pas lieu par la faute de celui qui les a données. Le marché est−il conclu? donnez des arrhes. Il s'est engagé, il a pris des arrhes. Donner des arrhes au coche. •On dit familièrement, qu'On a donné des arrhes au coche, pour faire entendre qu'On s'est engagé dans quelque affaire, dans quelque société. Je ne puis
A 201"""

pattern = r'(?u)\p{Lu}+(?: \p{Lu}+)*|\p{Ll}+'

matches = regex.findall(pattern, dico)

n =0
i = 0

definition  = ""
mot         = ''
while i < len(matches):

    if matches[i].isupper() and len(matches[i])>1:
        print definition
        definition =""
        word         = matches[i]
        print "[",word,"]"
    else:
        definition  += matches[i] + " "

    i = i + 1

结果是 debut pgm

[ ARRHEMENT ]
s m L action d arrher A chat de grains en vert et sur pied 
[ ARRHER ]
v a S assurer de quelque chose en donnant des arrhes A rrher des marchandises A rrh ? ? e participe 
[ ARRHES ]

但我希望能保留标点符号,(这样我也能检测类型,我有类型的列表,比如“s. m.”)

我相信这应该很简单,如果你能帮忙的话... 谢谢, romain。

1 个回答

3

编辑:如果你想把你的文本分成(单词,类型,定义),请始终使用新的正则表达式模块,你可以使用这个模式:

# -*- coding: utf-8 -*-
import regex

data = u'''ARRHEMENT. s. m. L'action d'arrher. Achat de grains en vert et sur pied. ARRHER.v. a. S'assurer de quelque chose en donnant des arrhes. Arrher des marchandises. Arrhé, ée. participe. ARRHES. s. f. pl. L'argent qu'on donne pour assurance de l'exécution d'un marché, et que l'on perd si le marché n'a pas lieu par la faute de celui qui les a données. Le marché est−il conclu? donnez des arrhes. Il s'est engagé, il a pris des arrhes. Donner des arrhes au coche. •On dit'''

pattern = r'''(?usx)
    (?<word> \b \p{Lu}+ (?> [ ] \p{Lu}+ )* )
    \. [ ]?
    (?<type> [a-z]{1,3} \. (?> [a-z]{1,3} \. )*)
    [ ]
    (?<def> .*? ) (?=(?1)\.|$)'''

matches = regex.findall(pattern, data)

print matches

旧的回答:

最简单的方法是使用新的正则表达式模块,而不是用re。这个模块支持字符类别,比如\p{Lu}代表大写字母,\p{Ll}代表小写字母。它还支持unicode标志(?u),这个标志的作用是全局的,不需要在每个选择部分都加上。

举个例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import regex

data = u'ARMÉ tu ARMÉE det PROPRÉTEUR def ÉTERNUER def À LA MALEHEURE test'


pattern = r'(?u)\p{Lu}+(?: \p{Lu}+)*|\p{Ll}+'

matches = regex.findall(pattern, data)

print matches

撰写回答