繁体   English   中英

如何使用 Python Regex 查找所有首字母为大写的单词

[英]How to find all words with first letter as upper case using Python Regex

我需要在文件中找到所有以大写字母开头的单词,我尝试了下面的代码,但它返回一个空字符串。

import os
import re

matches = []

filename = 'C://Users/Documents/romeo.txt'
with open(filename, 'r') as f:
    for line in f:
        regex = "^[A-Z]\w*$"
        matches.append(re.findall(regex, line))
print(matches)

文件:

Hi, How are You?

Output:

[Hi,How,You]

您可以使用

import os, re

matches = []
filename = r'C:\Users\Documents\romeo.txt'
with open(filename, 'r') as f:
    for line in f:
        matches.extend([x for x in re.findall(r'\w+', line) if x[0].isupper()])
print(matches)

这个想法是使用简单的\w+正则表达式提取所有单词,并仅将那些以大写字母开头的单词添加到最终matches列表中。

请参阅Python 演示

注意:如果您只想匹配字母单词,请使用r'\b[^\W\d_]+\b'正则表达式。

这种方法对 Unicode 友好,即任何第一个大写字母的 Unicode 字都会被找到。

还问

有没有办法将此限制为仅以大写字母开头的单词而不是所有大写单词

您可以将前面的代码扩展为

[x for x in re.findall(r'\w+', line) if x[0].isupper() and not x.isupper()]

请参阅此 Python 演示"Hi, How ARE You?" 产生['Hi', 'How', 'You']

或者,为了避免在 output 中出现 CaMeL 字词,请使用

matches.extend([x for x in re.findall(r'\w+', line) if x[0].isupper() and all(i.islower() for i in x[1:])])

请参阅此 Python 演示,其中all(i.islower() for i in x[1:])确保第一个字母之后的所有字母都是小写的。

完全正则表达式方法

您可以使用同时支持 Unicode 属性和 POSIX 字符类\p{Lu} / \p{Ll}[:upper:] / [:lower:]的 PyPi 正则表达式模块。 所以,解决方案看起来像

import regex
text = "Hi, How ARE You?"
# Word starting with an uppercase letter:
print( regex.findall(r'\b\p{Lu}\p{L}*\b', text) )
## => ['Hi', 'How', 'ARE', 'You']
# Word starting with an uppercase letter but not ALLCAPS:
print( regex.findall(r'\b\p{Lu}\p{Ll}*\b', text) )
## => ['Hi', 'How', 'You']

在线查看 Python 演示,其中

  • \b - 单词边界
  • \p{Lu} - 任何大写字母
  • \p{L}* - 任何零个或多个字母
  • \p{Ll}* - 任何零个或多个小写字母

您可以使用单词边界代替锚^$

\b[A-Z]\w*

正则表达式演示

请注意,如果您使用matches.append ,则将项目添加到列表中并且 re.findall 返回列表,这将为您提供列表列表。

import re

matches = []
regex = r"\b[A-Z]\w*"
filename = r'C:\Users\Documents\romeo.txt'
with open(filename, 'r') as f:
    for line in f:
        matches += re.findall(regex, line)
print(matches)

Output

['Hi', 'How', 'You']

如果左边应该有一个空白边界,你也可以使用

(?<!\S)[A-Z]\w*

正则表达式演示


如果您不想使用\w仅与大写字符匹配单词,则可以使用例如负前瞻来断言不仅大写字符直到单词边界

\b[A-Z](?![A-Z]*\b)\w*
  • \b防止部分匹配的单词边界
  • [AZ]匹配大写字符 AZ
  • (?![AZ]*\b)负前瞻,不仅断言大写字符后跟单词边界
  • \w*匹配可选的单词字符

正则表达式演示


要匹配以大写字符开头且不再包含任何大写字符的单词:

\b[A-Z][^\WA-Z]*\b
  • \b一个词的边界
  • [AZ]匹配大写字符 AZ
  • [^\WA-Z]*可选匹配一个不带字符 AZ 的单词 char
  • \b一个词的边界

正则表达式演示

暂无
暂无

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

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