Python正则表达式?我遇到了麻烦

时间:2016-07-10 11:58:59

标签: python regex

你好,世界! 我正处于正则表达式的麻烦中。我正在使用HTTP API(用于搜索意大利语列车),它提供了这些信息(例如):

10911 - SESTO S. GIOVANNI|10911-S01325

格式:

TRAIN_NUMBER - STATION|TRAIN_NUMBER - STATION_CODE

直到几乎没有请求,所以没关系,因为我只需要一个信息,“S01325”。但是当用户开始成长时,我发现可能有两列编号相同的列车。例如,列车612可以有两个数字,实际上API给了我:

612 - TARANTO|612-S11465
612 - ASSO|612-N00079

当(使用urllib.request模块)我尝试阅读时,我得到:

b'612 - TARANTO|612-S11465\n612 - ASSO|612-N00079\n'

我需要两个列表变量:

A = ['612 - TARANTO', '612 - ASSO'] #First regex expression
B = ['S11465', 'N00079'] #Second regex expression

我必须使用 REGEX ,是吗?我从未使用过REGEX,所以我不知道我必须做什么。我在Google和Wiki(s)/ docs上搜索过。但我没有找到(404)这个问题的解决方案。显然,正则表达式必须适用于所有情况,例如:

b'2097 - MILANO CENTRALE|2097-S01700\n'

给我:

A = ['2097 - MILANO CENTRALE']
B = ['S01700']

另一个例子:

b'123 - ROMA TERMINI|123-S01358\n123 - TREVIGLIO|123-S01703\n'

给我:

A = ['123 - ROMA TERMINI', '123 - TREVIGLIO']
B = ['S01358','S01703']

谢谢,非常感谢阅读。我希望我很清楚。 祝你有美好的一天, P.S。:Link to the italian docs

4 个答案:

答案 0 :(得分:4)

实际上,你不需要正则表达式。你可以使用它们。您的信息中有一个相当简单的模式:

<Train number> - <city>|<Train number>-<identifier>

所以,让我们来看看如果你做了

会发生什么
>>> '123 - ROMA TERMINI|123-S01358'.split('|', 1)
['123 - ROMA TERMINI', '123-S01358']

所以现在你有了你想要的第一部分。然后可以使用类似的东西修复第二部分,让我们看一下

>>> '123-S01358'.split('-', 1)
['123', 'S01358']

所以你可以做到

>>> '123-S01358'.split('-', 1)[-1]
'S01358'

你已经完成了!

如果将所有这些结合在一起,你应该得到答案。

答案 1 :(得分:2)

  

我必须使用REGEX,是吗?

不正确。

我认为更好的解决方案是将每一行解析为令牌并将其分配给合理的变量。你需要一个不太关于字符串原语和正则表达式的解决方案;更多关于对象和封装。

我设计了一个REST API,让我可以轻松查询列车并将响应作为JSON对象返回。

答案 2 :(得分:0)

首先,你必须convert your bytearrays to str objects

使用您提供的示例:

examples = [
    b'2097 - MILANO CENTRALE|2097-S01700\n',
    b'123 - ROMA TERMINI|123-S01358\n',
    b'123 - TREVIGLIO|123-S01703\n'
]

假设格式为:

[TRAIN_NAME]|[TRAIN_NAME_REPEATED]-[TRAIN_NUMBER]\n

我们不需要任何正则表达式,我们可以通过分隔符简单地分割条目:

for example_bytes in examples:
    example = example_bytes.decode("utf-8").split("|")
    # example = ['2097 - MILANO CENTRALE', '2097-S01700\n']

    train_name = example[0]
    # train_name = '2097 - MILANO CENTRALE'

    train_number = example[1].split("-")[1]
    # train_number = 'S01358'

    A.append(train_name)
    B.append(train_number.rstrip())

然后看结果:

print(A)
# ['2097 - MILANO CENTRALE', '123 - ROMA TERMINI', '123 - TREVIGLIO']
print(B)
# ['S01700', 'S01358', 'S01703']

如果您不希望重复输入(如果可能的话),我建议您使用sets而不是列表。

检查API文档,您需要依赖它提供条目的格式。

答案 3 :(得分:0)

你可以用json格式获得你想要的数据,为* Treno - Stazione *使用 ROMETTA MESSINESE 的代码获取正确的帖子:

from pprint import pprint as pp
import requests
import datetime

station = "S12049"
dt = datetime.datetime.utcnow()
arrival = "http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/arrivi/{station}/{iso}"
with requests.Session() as s:
   r = s.get(departure.format(station=station, iso=dt.strftime("%a %b %d %Y %H:%M:%S GMT+000 (UTC)")))
   pp(r.json())

离开:

arrival = "http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/partenze/{station}/{iso}"
with requests.Session() as s:
   r = s.get(arrival.format(station=station, iso=dt.strftime("%a %b %d %Y %H:%M:%S GMT+000 (UTC)")))
   pp(r.json())
相关问题