如何使用Regex从带人口数字的文本中匹配城市名称?
解决正则匹配城市名称的问题
你的原正则返回None的原因很明确:正则末尾的$锚定了字符串结尾,但你的字符串最后是数字序列,而正则只匹配字母、空格和连字符,自然找不到符合条件的内容,所以返回None。
正确的正则方案
想要提取所有城市名称,需要利用城市和人口之间的固定分隔格式( - 数字)来定位,推荐用正向预查精准匹配:
[A-Za-z]+(?:\s[A-Za-z]+)*(?=\s-\s\d)
正则说明:
[A-Za-z]+(?:\s[A-Za-z]+)*:匹配单单词或多单词的城市名(比如New York、Berlin),(?:...)是非捕获组,用来重复匹配“空格+字母组合”的结构。(?=\s-\s\d):正向预查,确保匹配的内容后面紧跟- 数字的格式,这样能准确找到每个城市的结束位置,且不会把分隔符和人口数字包含进来。
Python 代码示例
import re city_str = "New York - 8 468 000 Los Angeles - 3 849 000 Berlin - 3 645 000" pattern = r'[A-Za-z]+(?:\s[A-Za-z]+)*(?=\s-\s\d)' cities = re.findall(pattern, city_str) print(cities) # 输出结果: ['New York', 'Los Angeles', 'Berlin']
另一种简化方案
如果不想用复杂的正则,也可以先按人口部分分割字符串,再提取城市:
import re city_str = "New York - 8 468 000 Los Angeles - 3 849 000 Berlin - 3 645 000" # 按" - 数字开头的序列"分割 parts = re.split(r'\s-\s\d[\d\s]*', city_str) # 过滤空内容并去除首尾空格 cities = [part.strip() for part in parts if part.strip()] print(cities)
内容的提问来源于stack exchange,提问作者gleb
相关产品推荐
相关产品推荐

