![](/img/trans.png)
[英]Python: How to find a letter in a sentence's list of words and return those words in their original case (upper/lower)
[英]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']
\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.