2014-02-11 161 views
1

喜正则表达式的帮助,我有这个字符串在Python:解析字符串 - 在python

“每星期三和星期五,这个市场是完美的午餐!坐落在米纳圣隧道(第五街),这个位置非常适合逃离雾或雨。 \ r \ n \ r \ n位置:5th St. @ Minna St. \ r \ n时间:上午11:00至下午2:00 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ r \ nFiveten汉堡\ r \ nHiyaaa \ r \ n肋骨鞭子\ r \ nMayo &芥末\ r \ n \ r \ n \ r \ n需要?让OtG迎合您的下一个活动!开始访问offthegridsf.com/catering。'

我需要提取以下内容:

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]给出了供应商。但我相信有更好,更有效的方法来做到这一点。

任何帮助将不胜感激。

+0

我认为你是正确的,其实。我认为这是更普遍问题的一部分?即,总会有5个供应商?在第三次之前是否会有额外的行数,所以时间会是val [?]。否则,你说得对。 – audiodude

回答

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<group_name>...)定义)

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

谢谢,这个效果更好(即更一般)。你知道我如何使用正则表达式进一步提取每个值。我想在我的模型中存储时间,位置和供应商。我可以对“:”进行拆分,但是时间情况将不起作用。我想使它成为嵌套循环的一部分。谢谢! – user2216194

+0

编辑我的答案。什么是导致嵌套循环内的困难?重复调用re.search的效率并不低 - Python保留正则表达式的缓存,以便它不必重复编译同一个表达式。 – GVH

1
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