【问题标题】:Regex Pattern doesn't work using look behind without validating the fixed-width pattern正则表达式模式在不验证固定宽度模式的情况下无法使用look behind
【发布时间】:2026-01-03 08:45:01
【问题描述】:

我需要找到一个可以从下面的字符串中提取城市名称的正则表达式。 字符串的顺序是餐厅名称、地址、城市、电话、菜式

  • Chinois on Main 2709 Main St. Santa Monica 310-392-9025 Pacific New Wave
  • Benita's Frites 1433 Third St. Promenade Santa Monica 310-458-2889 Fast Food
  • Indo Cafe 10428 1/2 National Blvd. LA 310-815-1290 Indonesian
  • Diaghilev 1020 N. San Vicente Blvd. W. Hollywood 310-854-1111 Russian
  • Jody Maroni's Sausage Kingdom 2011 Ocean Front Walk Venice 310-306-1995 Hot Dogs

我试过这个正则表达式,但它不起作用:

zagat['city'] = zagat['raw'].str.extract("""
    ((?<=Ave.|Rd.|St.|Blvd.|Dr.|Way.|Pl.|Ln.|Ct.|Beach|Way ).+(?=...-...-....))
    """, expand=True)

你能帮忙吗?

【问题讨论】:

  • 您不需要在 Pandas extract 中进行积极的后向观察,因为它只输出捕获的子字符串。
  • 您需要转义点,\. 以匹配文字点,否则 . 表示任何字符。
  • 试试.extract(r'(?:(?:Ave|Rd|St|Blvd|Dr|Way|Pl|Ln|Ct)\.|Beach|Way|Walk)\s*(.+?)\s*\d{3}-\d{3}-\d{4}')
  • 非常感谢!

标签: python regex


【解决方案1】:

你可以使用

rx = r'(?:(?:Ave|Rd|St|Blvd|Dr|Way|Pl|Ln|Ct)\.|Beach|Way|Walk)\s*(.+?)\s*\d{3}-\d{3}-\d{4}'
zagat['city'] = zagat['raw'].str.extract(rx, expand=False)

regex demo

详情

  • (?:(?:Ave|Rd|St|Blvd|Dr|Way|Pl|Ln|Ct)\.|Beach|Way|Walk) - AveRdStBlvdDrWayPlLn 或 @9876543332@ 或 @98676 987654335@或Walk
  • \s* - 0+ 个空格
  • (.+?) - 第 1 组(此值将由 .extract 返回):除换行符之外的任何一个或多个字符,尽可能少
  • \s* - 0+ 个空格
  • \d{3}-\d{3}-\d{4} - 3 位、-、3 位、- 和 4 位。

【讨论】:

    最近更新 更多