如何在python中使用regex“跳过”特定单词?

2024-09-30 16:26:50 发布

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

我正在写一个程序,以维基百科上一个德语习语的解释为例,捕捉这个习语,它的意思和任何附加信息。你知道吗

例如,粗体文本应匹配:

** Sich wie ein Backfisch benehmen – albern bzw. unreif sein. Zur Etymologie des Wortes „Backfisch“ für unreife Mädchen siehe dort. (Sprichwort um 1900: „Mit 14 Jahr’n und sieben Wochen ist der Backfisch ausgekrochen.“[6]).

基本上,这个短语在破折号-之后开始,在第一个句号之前结束,也就是说,它只有一个句子。但是,我想跳过缩写,例如bzw。z.B.u.A.等,因为它们不标记句子的结尾。你知道吗

我不知道如何跳过这个词,但仍然匹配它。另外,正如我所说的,我想跳过德语中常用的缩写,比如前面提到的斜体缩写。你知道吗

我已经尝试过匹配一个以-开始并以结束的结构,而不应该以bzw开头。然而,我没有成功地做到这一点。你知道吗


Tags: 文本程序信息句子习语einsichzur
2条回答

使用非捕获组。看一看:

(?<=– )(?:.+)?(?:bzw\.|Z\. b\.|u\. a\.)[^\.]+

enter image description here

Regex Demo-右上角可以看到单个regex组件的描述。你知道吗

(?<=– )                    start after – character + whitespace, but not match
(?:.+)?                    add any text before abbreviation into non-capturing group.
(?:bzw\.|Z\. b\.|u\. a\.)  add abbreviations into non-capturing group. Escape the dots via \. 
[^\.]+                     match anything until fullstop

基本上,这个想法是从–字符+空格开始,但不匹配它。然后捕获以下任何文本、缩写并捕获到第一个点.,但不捕获缩写组(注意?:)。因为缩写点是非捕获组的一部分,我们“跳过”它并继续,直到结束句子的点。您可以通过|符号添加更多缩写来扩展缩写列表。你知道吗

奖金:

如果您预期并不总是从序列开始,那么可以执行以下操作:

(?:– |: )((?:.+)?(?:bzw\.|Z\. b\.|u\. a\.)[^\.]+)

例如,这将允许regex使用:字符而不是,但是您需要将结果作为组1检索。你知道吗

Regex Demo

这在德语中是个问题,使用缩写,我在处理德语文本时也遇到过。你有没有试着用德语语法分析器,把你的文本分成短语或句子?试试看,可能有用。例如,在Python中有NLTK和Stanford。你知道吗

在英语或法语中,人们可能会说短语的结尾由一个点、空格和大写字母组成。然而,这对德语不起作用,因为名词是大写的。你知道吗

另一方面,正如你提到的“常用缩略语”,如果它们如此频繁,为什么不把它们收集在字典里,并使用它们,以便在文本中跳过它们呢?你知道吗

相关问题 更多 >