如何删除Python字符串中以大写字母开头的子字符串?

2024-06-02 06:30:17 发布

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

我有一个字符串,它是一个标题和一个常规句子的混合体(没有分隔符将两者分开)

text = "Read more: Indonesia to Get Moderna Vaccines Before the pandemic began, a lot of people were...."

标题实际上以单词Vaccines结尾,Before the pandemic是另一个与标题完全分离的句子

如何删除子字符串,直到出现单词?我的想法是删除“阅读更多”一词中的所有单词,然后删除以大写字母开头的所有单词,直到一个单词之前(before)。但我不知道如果它遇到了连词或介词,而这些连词或介词在标题中不需要大写,比如单词the,该怎么办

我知道有一个函数title()可以在Python中将字符串转换为标题格式,但是有没有任何函数可以检测子字符串是否是标题

我使用正则表达式尝试了以下方法

import re
text = "Read more: Indonesia to Get Moderna Vaccines Before the pandemic began, a lot of people were...."
res = re.sub(r"\s*[A-Z]\s*", " ", text)
res

但它只是删除了所有以大写字母开头的单词


Tags: theto字符串text标题readgetmore
2条回答

你为什么不直接用切片呢

title = text[:44]
print(title)

Read more: Indonesia to Get Moderna Vaccines

您可以通过匹配一系列大写单词和words that can be non-capitalized in titles来匹配标题

^(?:Read\s+more\s*:)?\s*(?:(?:[A-Z]\S*|the|an?|[io]n|at|with(?:out)?|from|for|and|but|n?or|yet|[st]o|around|by|after|along|from|of)\s+)*(?=[A-Z])

regex demo

详细信息

  • ^-字符串的开头
  • (?:Read\s+more\s*:)?-可选的非捕获组匹配Read、一个或多个空格、more、零个或多个空格和:
  • \s*-零个或多个空格
  • (?:(?:[A-Z]\S*|the|an?|[io]n|at|with(?:out)?|from|for|and|but|n?or|yet|[st]o|around|by|after|along|from|of)\s+)*-零个或多个
    • (?:[A-Z]\S*|the|an?|[io]n|at|with(?:out)?|from|for|and|but|n?or|yet|[st]o|around|by|after|along|from|of)-一个大写的单词,可能包含任何非空白字符或在英文标题中可以保持非大写的单词之一
    • \s+-一个或多个空格
  • (?=[A-Z])-后跟大写字母

注意:您提到您的语言不是英语,所以

  1. 您需要找到标题中可能不大写的语言单词列表,并使用它们而不是^(?:Read\s+more\s*:)?\s*(?:(?:[A-Z]\S*|the|an?|[io]n|at|with(?:out)?|from|for|and|but|n?or|yet|[st]o|around|by|after|along|from|of
  2. 您可能希望将[A-Z]替换为\p{Lu}以匹配任何Unicode大写字母,将\S*替换为\p{L}*以匹配任何零个或多个Unicode字母,但请确保使用PyPi正则表达式库,因为Python内置的re不支持Unicode类别

相关问题 更多 >