【问题标题】:parsing string - regex help in python解析字符串 - python 中的正则表达式帮助
【发布时间】:2014-02-11 00:13:07
【问题描述】:

嗨,我在 Python 中有这个字符串:

'每周三和周五,这个市场非常适合午餐!坐落在 Minna St. 隧道(位于 5th St.),这个位置非常适合躲避雾或雨。每周五观看现场音乐。\r\n\r\n位置:5th St. @ Minna St.\r\n时间:11:00am-2:00pm\r\n\r\n供应商:\r\nKasa Indian\ r\nFiveten Burger\r\nHiyaaa\r\nThe Rib Whip\r\nMayo & Mustard\r\n\r\n\r\n餐饮需求?让 OtG 迎合您的下一个活动!访问 offthegridsf.com/餐饮开始。'

我需要提取以下内容:

Location: 5th St. @ Minna St.
Time: 11:00am-2:00pm

Vendors:
Kasa Indian
Fiveten Burger
Hiyaaa
The Rib Whip
Mayo & Mustard

我尝试使用:

val = desc.split("\r\n")

然后val[2] 给出位置,val[3] 给出时间,val[6:11] 给出供应商。但我确信有一种更好、更有效的方法可以做到这一点。

我们将不胜感激。

【问题讨论】:

  • 我认为你说得对,实际上。我认为这是一个更普遍的问题的一部分?即,总是会有 5 个供应商吗?在第三行之前是否可能会有额外的行,所以时间会是 val[?]。否则,你做对了。

标签: python regex django string


【解决方案1】:

如果您的输入总是以这种方式格式化,则最好使用str.split()。如果您想要一些更有弹性的东西,这里有一个正则表达式方法,使用re.VERBOSEre.DOTALL

import re

desc_match = re.search(r'''(?sx)
    (?P<loc>Location:.+?)[\n\r]
    (?P<time>Time:.+?)[\n\r]
    (?P<vends>Vendors:.+?)(?:\n\r?){2}''', desc)

if desc_match:
    for gname in ['loc', 'time', 'vends']:
        print desc_match.group(gname)

鉴于您对desc 的定义,打印出来的是:

Location: 5th St. @ Minna St.
Time: 11:00am-2:00pm

Vendors:
Kasa Indian
Fiveten Burger
Hiyaaa
The Rib Whip
Mayo & Mustard

在这里效率真的无关紧要,因为无论哪种方式,时间都可以忽略不计(除非存在瓶颈,否则不要优化。)再说一次,如果它比您使用的解决方案更频繁地工作,这只会“更好” str.split() - 也就是说,如果有任何可能的输入字符串,您的解决方案不会产生正确的结果。

如果您只想要值,只需将前缀移到组定义之外(组由(?P&lt;group_name&gt;...) 定义)

r'''(?sx)
    Location: \s* (?P<loc>.+?)   [n\r]
    Time:     \s* (?P<time>.+?)  [\n\r]
    Vendors:  \s* (?P<vends>.+?) (?:\n\r?){2}'''

【讨论】:

  • 谢谢,这效果更好(即更通用)。你知道我如何进一步使用正则表达式来提取每个值。我想在我的模型中存储时间、位置和供应商。我可以对“:”进行拆分,但时间案例将不起作用。我想让它成为嵌套循环的一部分。谢谢!
  • 编辑了我的答案。是什么导致将其嵌套在循环中的困难?重复调用 re.search 并不是低效的——Python 保留了正则表达式的缓存,因此它不必重复编译同一个表达式。
【解决方案2】:
NLNL = "\r\n\r\n"

parts = s.split(NLNL)
result = NLNL.join(parts[1:3])
print(result)

给了

Location: 5th St. @ Minna St.
Time: 11:00am-2:00pm

Vendors:
Kasa Indian
Fiveten Burger
Hiyaaa
The Rib Whip
Mayo & Mustard

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多