Python 如何使用re.findall查找不是所有大写字母的单词?

Python 如何使用re.findall查找不是所有大写字母的单词?,python,regex,findall,Python,Regex,Findall,例如,我有s=“我真的不想谈论它,一点也不想!” 我想re.findall(reg,s)返回 “我”“不”“想”“谈论”“它”“一点也不”! 到目前为止,我得到了reg=r'[^\w\s]+\w+\n',它不能过滤掉单词“真的” 谢谢该\w+模式匹配1个或多个任意单词字符,包括ALLCAPS中的单词 注意,I,一个代词,也是ALLCAPS。因此,假设您想跳过所有2个或更多字母的Alp帽词,可以考虑将当前模式固定为 r'[^\w\s]+|\b(?![A-Z]{2,}\b)\w+|\n' 见 \b

例如,我有
s=“我真的不想谈论它,一点也不想!”

我想
re.findall(reg,s)
返回
“我”“不”“想”“谈论”“它”“一点也不”!

到目前为止,我得到了
reg=r'[^\w\s]+\w+\n'
,它不能过滤掉单词
“真的”


谢谢该
\w+
模式匹配1个或多个任意单词字符,包括ALLCAPS中的单词

注意,
I
,一个代词,也是ALLCAPS。因此,假设您想跳过所有2个或更多字母的Alp帽词,可以考虑将当前模式固定为

r'[^\w\s]+|\b(?![A-Z]{2,}\b)\w+|\n'

\b(?![A-Z]{2,}\b)\w+
模式匹配

  • \b
    -单词边界
  • (?![A-Z]{2,}\b)
    -如果当前位置右侧紧跟着两个或多个ASCII大写字母,后跟一个单词边界,则会导致匹配失败的负前瞻
  • \w+
    -1个或多个单词字符(如果您只想匹配字母,请替换为
    [^\w\d\]+

要支持所有Unicode大写字母,您可以使用PyPi正则表达式和
r'[^\w\s]+|\b(?!\p{Lu}{2,}\b)\w+\n'
模式,或者使用
pLu='[{}]'格式(“.join([chr(i)表示范围内的i)(sys.maxunicode)如果chr(i).isupper())
(3)或
pLu=u'[}]'.format(u.join)表示范围内的i)(sys.maxunicode)if unichr(i).isupper())
(Python 2)。请参阅。注意,我建议坚持使用最新的Python版本或最新的PyPi正则表达式模块。

Brian Kernighan的这句话对正则表达式尤其适用

每个人都知道调试的难度是用计算机编写程序的两倍 首先,如果你在写作时尽可能聪明的话 它,你将如何调试它

因此,如果在单个正则表达式中很难执行某些操作,您可能希望将其分为两个步骤。首先查找所有单词,然后过滤掉所有大写单词。更易于理解和测试

>>> import re
>>> s="I REALLY don't want to talk about it, not at all!"
>>> words = re.findall(r"[\w']+", s)
>>> words = [w for w in words if w.upper() != w]
>>> print(words)
["don't", 'want', 'to', 'talk', 'about', 'it', 'not', 'at', 'all']

你是说只有ASCII大写字母还是任何大写字母(
Я
Γ
,等等)?试试
r'[^\w\s]+\b(?![A-Z]{2,}\b)\w+\n'
如果你只想使用ASCII字符。而且,“I”都是大写的。请看下面的mu答案,它应该对你有用。它对我有用:re.findall(r“\b['\w]*[A-Z][\w'*\s)谢谢!是否有任何推荐的关于reg表达式的书籍/文档与您在这里写的一样有很好的解释?@SoManyProblems不知道您指的是答案的哪一部分。要查看特定的正则表达式描述,请访问regex101.com。要了解一般的正则表达式,有一个很好的解释。@SoManyProblems如果此解决方案对您有效,请我拒绝接受答案。