单词之间的大写单词- Regex

eyh26e7m  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(158)

我正在尝试使用Regex查找单词之间出现的大写单词。我想忽略.?!和段落开头之后的大写单词。
目前正在使用下面的代码来查找大写字母
[A-Z][^\s]*

Example 

A sentence containing Capital letters. How to Extract only capital letters?

字符串
正则表达式应该只找到大写和提取,而忽略How和A

hrirmatl

hrirmatl1#

一个可能的解决方案是,找到所有的模式,但是只在你想要匹配的模式上使用捕获组(regex101):

import re

pat = re.compile(r"^\s*[A-Z]+|[.?!]\s*[A-Z]+|([A-Z][^\s.?!]*)")

text = "A sentence containing Capital letters. How to Extract only capital letters?"

for m in pat.findall(text):
    if m:
        print(m)

字符串
打印:

Capital
Extract

pw136qt2

pw136qt22#

@Andrej的解决方案将返回一个空值列表,其中为您的示例数据找到了其他大写的单词(即AHow):

['', 'Capital', '', 'Extract']

字符串
如果你想 * 只 * 返回大写的单词,那么使用负向后查找:

(?<![.?!\s])\s+([A-Z][a-z]*)


这匹配任何前面没有.,?的大写单词。注意,我们还在否定后向中包括\s,以确保我们不匹配句子开头的两个空格的单词,例如。

end.  Start


如果\s未包含在后向中,则将匹配Start
regex101上的正则表达式演示
在python中:

text = 'A sentence containing Capital letters.  How to Extract only capital Letters?'
re.findall('(?<![.?!\s])\s+([A-Z][a-z]*)', text)


输出量:

['Capital', 'Extract', 'Letters']

rryofs0p

rryofs0p3#

一个更广泛的匹配,使用单词边界来查找单词之间出现的大写单词(不具体考虑.!?):

\b\s+([A-Z][a-z]*)

字符串
参见regex demo
例如

import re

s = "A sentence containing Capital letters. How to Extract only capital letters?"
pattern = r"\b\s+([A-Z][a-z]*)"
print(re.findall(pattern, s))


输出

['Capital', 'Extract']

jexiocij

jexiocij4#

尝试

(?:(?:[.!?]\h*[A-Z]|^[A-Z])(*SKIP)(*FAIL))|\b[A-Z]\w*

字符串
演示:https://regex101.com/r/SmcmBW/latest
(?:(?:<unwanted_option1>|<unwanted_option2>)(*SKIP)(*FAIL))构造忽略所有不需要的选项,利用这个“技巧”(https://www.rexegg.com/regex-best-trick.html)。您可以稍后轻松添加更多限制。在这种情况下,它可以防止.!?位于大写单词之前,以及单词是一行中的第一个。
\b[A-Z]\w*选择所有大写单词。
使用更强大的regex包的Python代码段:

import regex

pat = regex.compile(r"(?:(?:[.!?]\h*[A-Z]|^\h*[A-Z])(*SKIP)(*FAIL))|\b[A-Z]\w*")

text = "A sentence containing Capital letters. How to Extract only capital letters?"

for m in pat.findall(text):
    if m:
        print(m)

相关问题