检查Python中的截断文本

2024-06-28 10:34:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图建立一个集合,其中包含用户从字符串中查询的所有单词

# Step 1: Read the string
instr = 'Lorem ipsum dolor sit amet, unde curabitur nonummy nonummy, cras dui eget, accumsan placerat nibh cumque vel augue, vitae laoreet at. Urna feugiat. Ut ante neque duis neque metus lectus. Neque rutrum tortor adipiscing omnis neque urna, diam vivamus. Pulvinar quis id, porta class felis enim vulputate, tempus arcu, sit porta. Nec praesent orci in, orci id duis purus ultrices, non sit vel. Cras ipsum nibh nulla suspendisse neque, mi dis, vestibulum a ipsum, morbi a curabitur porttitor sodales sit nullam, mus tristique feugiat vel per orci. Lacus elit molestie quam, ac nibh nulla in faucibus quis volutpat. Congue cum massa. Convallis in ultricies eget velit, erat elit eleifend.'

text_lowercase = instr.lower()
# Turn them in to set. Easy enough
all_words = set(text_lowercase)

# Step 2: Compare with the user's words:
all_words & user_words
# And those are the user's words that exist in the text.

这是我的问题

假设用户查询像lor*con*这样的术语。 我希望能够将以lorcon开头的每个单词添加到我的set。通过快速浏览,我发现有CongueConvallis这样的词。所以这2个应该加到集合中


Tags: thetext用户instep单词wordsset
2条回答

你不需要正则表达式,你可以使用列表理解和str.startswith()

[w for w in instr.split() if w.lower().startswith(('lor', 'con'))]
# ['Lorem', 'Congue', 'Convallis']

或者,由于前缀的长度总是相同的,所以需要进行一个简单的in检查:

[w for w in instr.split() if w[:3].lower() in {'lor', 'con'}]

您可以将*替换为\w*,并使用con*这样的模式本身作为正则表达式来搜索

>>> word = "con*"
>>> re.findall(word.replace("*", "\w*"), instr.lower())
['congue', 'convallis']
>>> word = "*val*is"
>>> re.findall(word.replace("*", "\w*"), instr.lower())
['convallis']

您还可以将word.replace的结果括在\b...\b^...$(在分句中匹配单个单词时)中,以说明单词边界

>>> word = "l*"
>>> re.findall(r"\b%s\b" % word.replace("*", "\w*"), instr.lower())
['lorem', 'laoreet', 'lectus', 'lacus']

相关问题 更多 >