Python正则表达式?我有麻烦了

2024-10-02 16:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,世界! 我遇到了正则表达式的麻烦。我正在使用一个HTTP API(用于搜索意大利火车)来提供这些信息(例如:

10911 - SESTO S. GIOVANNI|10911-S01325

格式:

TRAIN_NUMBER - STATION|TRAIN_NUMBER - STATION_CODE

在很少有人请求之前,一切都没关系,因为我只需要一个信息,“s0132”。但当用户开始增长时,我发现可能有两列火车的编号相同。例如,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,对吗?我从没用过正则表达式,所以我不知道该怎么办。我在Google和Wiki/docs上搜索过。但是我没有找到解决这个问题的方法。显然,regex表达式必须适用于所有情况,例如:

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']

谢谢,非常感谢你的阅读。我希望我说得很清楚。 祝您今天过得愉快, 马可 附言:Link to the italian docs


Tags: api信息docsnumbertrainregexexpressionstation
3条回答

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

<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'

你就完了!你知道吗

如果你把所有这些结合起来,你应该得到你的答案。你知道吗

I must use REGEX, true?

不是真的。你知道吗

我认为一个更好的解决方案是将每一行解析成标记,并将它们分配给可感知的变量。您需要一个解决方案,它不太关注字符串原语和regex,而更关注对象和封装。你知道吗

我会设计一个restapi,让我可以轻松地查询trains并将响应作为JSON对象返回。你知道吗

首先,你必须convert your ^{}s to ^{} 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文档,您将取决于它提供的条目的格式。你知道吗

相关问题 更多 >