Python:如何提取字符串中连续的标题格式单词序列
提取连续首字母大写单词序列的解决方案
看起来你之前的代码只能识别两个连续的标题格式单词,要扩展到识别任意长度的连续序列,其实可以通过分组遍历或者正则表达式来实现,下面给你两种实用的方法:
方法一:手动遍历分组(直观易调试)
这种方法通过逐个遍历单词,把连续符合条件的单词归为一组,当遇到不符合的单词时,检查当前组的长度,符合要求就保存下来。代码如下:
def get_composite_names(s): words = s.split() composite_names = [] current_group = [] for word in words: # 用istitle()判断是否是标题格式(首字母大写,其余小写) if word.istitle(): current_group.append(word) else: # 只有当组内单词数≥2时才加入结果 if len(current_group) >= 2: composite_names.append(' '.join(current_group)) current_group = [] # 别忘了处理循环结束后剩下的最后一组 if len(current_group) >= 2: composite_names.append(' '.join(current_group)) return composite_names
测试一下:
test_str = 'John Walker Smith is currently in New York' print(get_composite_names(test_str)) # 输出: ['John Walker Smith', 'New York']
如果你的场景中,单词可能存在非首字母的大写(比如"McDonald"或者"IBM"这种),可以把判断条件改成word[0].isupper(),这样只要首字母大写就会被纳入分组。
方法二:正则表达式(简洁高效)
正则表达式可以直接匹配连续的符合条件的单词序列,代码更简洁:
import re def get_composite_names(s): # 正则模式:匹配至少两个连续的首字母大写、其余小写的单词 pattern = r'\b([A-Z][a-z]+(?:\s[A-Z][a-z]+)+)\b' return re.findall(pattern, s)
模式解释:
\b:匹配单词边界,避免匹配单词的一部分[A-Z][a-z]+:匹配首字母大写、后面跟小写字母的单词(?:\s[A-Z][a-z]+)+:非捕获组,匹配"空格+符合条件的单词",至少重复一次(保证整个序列至少有两个单词)
同样测试上面的示例字符串,得到的结果和方法一完全一致。如果需要兼容非首字母大写的情况,把正则模式改成r'\b([A-Z][^\s]*(?:\s[A-Z][^\s]*)+)\b'即可。
内容的提问来源于stack exchange,提问作者jax
相关产品推荐
相关产品推荐

