【问题标题】:how to use re.findall to find the words that is NOT of all uppercase letters?如何使用 re.findall 查找不是全部大写字母的单词?
【发布时间】:2019-04-18 12:32:57
【问题描述】:

例如我有s="I REALLY don't want to talk about it, not at all!"

我想要re.findall(reg, s) 回来 "I" "don't" "want" "to" "talk" "about" "it" "," "not" "at" "all" "!"

到目前为止,我得到了reg=r'[^\w\s]+|\w+|\n',它无法过滤掉"REALLY"这个词

谢谢

【问题讨论】:

  • 您的意思是只有 ASCII 大写还是任何大写字母(ЯГ 等)?如果您只想使用 ASCII 字符,请尝试 r'[^\w\s]+|\b(?![A-Z]{2,}\b)\w+|\n'
  • 另外,“I”全是大写。
  • 请参阅下面的 mu 答案,它应该适合您。
  • 它适用于我:re.findall(r"\b['\w]*[a-z]+[\w']*\b",s)

标签: python regex findall


【解决方案1】:

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

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

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

regex demo

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

  • \b - 字边界
  • (?![A-Z]{2,}\b) - 如果在当前位置的右侧有 2 个或更多 ASCII 大写字母后跟单词边界,则匹配失败
  • \w+ - 1 个或多个单词字符(如果您只想匹配字母,请替换为 [^\W\d_]+)。

要支持所有 Unicode 大写字母,您可以使用带有 r'[^\w\s]+|\b(?!\p{Lu}{2,}\b)\w+|\n' 模式的 PyPi 正则表达式,或者使用 pLu = '[{}]'.format("".join([chr(i) for i in range(sys.maxunicode) if chr(i).isupper()])) (Python 3) 或 pLu = u'[{}]'.format(u"".join([unichr(i) for i in xrange(sys.maxunicode) if unichr(i).isupper()])) (Python 2) 构建类。见Python regex for unicode capitalized words。注意我建议坚持使用最新的 Python 版本或最新的 PyPi 正则表达式模块。

【讨论】:

  • 谢谢!有没有推荐的关于 reg 表达式的书/文档,就像你在这里写的一样,有很好的解释?
  • @SoManyProblems 不知道您指的是答案的哪一部分。要查看特定的正则表达式描述,请访问 regex101.com。要学习一般的正则表达式,有一个不错的"Mastering Regular Expressions" book written by J. Friedl
  • @SoManyProblems 如果此解决方案对您有用,请考虑接受答案。
【解决方案2】:

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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2021-07-18
    • 2022-11-23
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多