我在完成一个正则表达式教程时遇到了问题\ 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',不会和不能当不一切都试图抓住预计会有撇号?
答案 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个句子,除非对某个句子有特殊要求。