Python re.findall()大写单词,包括Apostrophes

时间:2018-01-20 04:48:20

标签: python regex python-3.x

我在完成一个正则表达式教程时遇到了问题\ w +用“查找my_string中的所有大写单词并打印结果”来引用这个问题的单词,其中一些单词有撇号。

原始字符串:

In [1]: my_string
Out[1]: "Let's write RegEx!  Won't that be fun?  I sure think so.  Can you 
find 4 sentences?  Or perhaps, all 19 words?"

当前尝试:

# Import the regex module
import re
# Find all capitalized words in my_string and print the result
capitalized_words = r"((?:[A-Z][a-z]+ ?)+)"
print(re.findall(capitalized_words, my_string))

当前结果:

['Let', 'RegEx', 'Won', 'Can ', 'Or ']

我认为期望的结果是:

['Let's', 'RegEx', 'Won't', 'Can't', 'Or']

你怎么从r“((?:[AZ] [az] +?)+)”到选择's和't结尾的Let',不会和不能当不一切都试图抓住预计会有撇号?

3 个答案:

答案 0 :(得分:5)

只需将撇号添加到第二个括号组:

capitalized_words = r"((?:[A-Z][a-z']+)+)"

答案 1 :(得分:0)

我想你可以在小组[a-z']中添加一点撇号。 所以它就像((?:[A-Z][a-z']+ ?)+)

希望有效

答案 2 :(得分:0)

虽然你有答案,但我想提供一个更真实的世界"解决方案使用nltk

from nltk import sent_tokenize, regexp_tokenize

my_string = """Let's write RegEx!  Won't that be fun?  I sure think so.  Can you 
find 4 sentences?  Or perhaps, all 19 words?"""

sent = sent_tokenize(my_string)
print(len(sent))
# 5

pattern = r"\b(?i)[a-z][\w']*"
print(len(regexp_tokenize(my_string, pattern)))
# 19

而且imo,这些是5个句子,而不是4个句子,除非对某个句子有特殊要求。