Python 正则表达式在一系列中查找大写单词,同时允许and、to等位于它们之间
假设我有一个字符串,比如:Python 正则表达式在一系列中查找大写单词,同时允许and、to等位于它们之间,python,regex,Python,Regex,假设我有一个字符串,比如: Hello There what have You Been Doing. I am Feeling Pretty Good and I Want to Keep Smiling. 我正在寻找结果: ['Hello There', 'You Been Doing', 'I am Feeling Pretty Good and I Want to Keep Smiling'] 经过很长一段时间的搔头,后来演变成了当头棒喝,我转向互联网寻求答案。到目前为止,我已经找
Hello There what have You Been Doing.
I am Feeling Pretty Good and I Want to Keep Smiling.
我正在寻找结果:
['Hello There', 'You Been Doing', 'I am Feeling Pretty Good and I Want to Keep Smiling']
经过很长一段时间的搔头,后来演变成了当头棒喝,我转向互联网寻求答案。到目前为止,我已经找到了以下几点:
r"([A-Z][a-z]+(?=\s[A-Z])(?:\s[A-Z][a-z]+)+)"
上面的作品,但它显然不允许“和”、“to”、“for”、“AM”(这些是我所寻找的唯一的三个)在单词的中间,我不知道如何在里面添加。我假设我必须使用管道来实现这一点,但是我应该把这个组放在哪里呢
<>我也试过了答案,但它们并没有结束对我的工作。 < P>如果你能在大写句子的中间列举出你没问题的话,我会用一个交替来代表它们:
\b(?:and|or|but|to|am)\b
并使用该选项匹配一系列大写单词和已接受的非大写单词,这些单词必须以大写单词开头:
[A-Z][a-z]*(?:\s(?:[A-Z][a-z]*|(?:and|or|but|to|am)\b))*
如果您对任何三个字母或更少的单词(包括“owl”或“try”等单词,但不包括“what”等单词)未大写表示满意,您可以使用以下方法:
[A-Z][a-z]*(?:\s(?:[A-Z][a-z]*|[a-z]{1,3}\b))*
我想下面也适用于itertools.groupby
from itertools import groupby
s = 'Hello There what have You Been Doing. I am Feeling Pretty Good and I Want to Keep Smiling.'
[ ' '.join( list(g) ) for k, g in groupby(s.split(), lambda x: x[0].islower() and x not in ['and','to'] ) if not k ]
输出:
['Hello There',
'You Been Doing. I',
'Feeling Pretty Good and I Want to Keep Smiling.']
任何像“and”或“to”这样的词都不是一个足够正式的定义。“off”会是其中一个词吗?“试试”怎么样?你能列举这些词吗?或者提供一个更好的定义?第二个恰巧就是我要找的,这个很好用。谢谢!