繁体   English   中英

Python 如果有大写字母,则将短语拆分为单词,但如果它们之间有逗号,则不拆分

[英]Python splitting a phrase into words if there is a capital letter, but not if there is a comma between them

我正在尝试将一个短语拆分成单词。

例子

输入是:

Varie Tutto l'anno Nessuna Triennale,Magistrale Italia Alta

预期 output 是:

['Varie ', "Tutto l'anno ", 'Nessuna ', 'Triennale, Magistrale ', 'Italia ', 'Alta']

免责声明

当有大写字母时,我成功地将短语拆分为单词,但是我意识到其中一些之间有一个逗号(实际上我需要将它们放在一起)所以我想排除这种情况下的拆分。 我刚开始接触这类东西,这个 re.split function 真的很混乱。

我试过的

我尝试了以下方法:

re.split('(?=[A-Z])+|[,]',text )

然而,这并不完全符合我的要求,因为它在遇到逗号时也会分开,但我正试图做相反的事情。

我怎样才能做到这一点?

TL;DR:按空间拆分并环顾四周: re.compile(r'(?<,?) (.=[AZ])').split(text) ,第 4 节中的详细信息。

0. 试试你的正则表达式

在 regex101 或 regexpl.net(具有 Python 风格)上尝试您的正则表达式。

演示

\b(?<!,)[A-Z]

用途:

  1. \b字边界(空格或逗号或点等)
  2. (?<,,)否定后视:以下不应以逗号开头
  3. [AZ]字符范围的大写字母 (AZ)

1.拆分

在 Python:

import re

text = "Varie Tutto l'anno Nessuna Triennale,Magistrale Italia Alta"

words = re.split(r'\b(?<!,)[A-Z]', text)
print(words)

印刷:

['', 'arie ', "utto l'anno ", 'essuna ', 'riennale,Magistrale ', 'talia ', 'lta']

好的,结果中有一些空字符串。

哎呀,大写字母被吞没了……让我们修理分离器。 它不应包括 [AZ] 作为分隔符:

在Python中,如何拆分字符串并保留分隔符?

2.查找所有

re.findall(r'\b(?<!,)[A-Z][^A-Z]*', text)

印刷:

['Varie ', "Tutto l'anno ", 'Nessuna ', 'Triennale,', 'Italia ', 'Alta']

但在逗号后全部吞下(例如,结果Triennale,中缺少Magistrale ,而不是预期的Triennale,Magistrale )。

以大写字母拆分字符串

3.替代与拆分

同时使用 lookbehind 和 lookahead 以及 NUL special-char \0作为分隔符。

re.sub(r'(?<!,)\b(?=[A-Z])', '\0', text).split('\0')

印刷:

['', 'Varie ', "Tutto l'anno ", 'Nessuna ', 'Triennale,Magistrale ', 'Italia ', 'Alta']

结果中仍然有一些空字符串。

Python 正则表达式后视和前视

4.按预期拆分

re.compile(r'(?<!,) (?=[A-Z])').split(text)

印刷:

['Varie', "Tutto l'anno", 'Nessuna', 'Triennale,Magistrale', 'Italia', 'Alta']

现在所有空格都被吞没了(例如,结果是Varie而不是Varie ),因为这是分隔符。

我坚信我提出的不是最好的主意,而是解决您问题的方法。 这就是我想出的:

import re
input = "Varie Tutto l'anno Nessuna Triennale,Magistrale Italia Alta"
output = re.sub('(\s|^)([A-Z][^A-Z]*)($|\s)', r'\n\2\n',input)
output = re.split("\n", output)
output = list(filter(None, output))

output

['Varie', "Tutto l'anno", 'Nessuna', 'Triennale,Magistrale', 'Italia', 'Alta']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM