首页 > 解决方案 > 正则表达式匹配特定行中的数字

问题描述

我有以下字符串:

Apple---a---1---d---2
Pear---b---3---e---4
Melon---c---9---f---8

我的输入是一个水果,我想从该特定行中选择所有数字。例如:

input: Apple
output: 1 2

input: Pear
output: 3 4

我可以使用 2 个正则表达式来做到这一点:一个用于获取线路,一个用于从线路中获取数字,但有没有办法将其合二为一?

谢谢!


编辑

我看到我必须更具体。问题:是否有可能在一个模式中捕捉到重复?我在 Pear 线上有一个匹配项,我能以某种方式抓住那条线上的数字吗?上面的例子不是现实生活中的,我不想用任何语言实现,不管是不是水果,只是一个简单的例子的抽象问题。

对于上面的示例,我创建了这个:

(?:Pear)(?:[^;\d])*(\d)(?:[^;\d])*(\d)

但正如你所看到的,我通过重复小组达到了我的目标

(?:[^;\d])*

如果我尝试使用乘数来执行此操作,它只会捕获最后一个数字,并且我想要所有数字。据我所知,这个问题没有解决方案,但是stackoverflow不允许我删除这个问题。我正在使用 regex101 进行检查。

标签: regex

解决方案


是的,您可以使用split() on ---,即:

[y.strip() for y in x.split("---")]

s = """
Apple---a---1---d---2
Pear---b---3---e---4
Melon---c---9---f---8
"""


def fruit_game(fruit):
    out = ""
    for x in s.split():
        parts = [y.strip() for y in x.split("---")]
        if parts[0] == fruit :
            out = "{}\n{} {}".format(parts[0], parts[2], parts[4])
            break
    if out :
        return(out)
    else:
        return("Fruit not found")
while 1:  
    fruit = input("Choose a fruit:")
    print( fruit_game(fruit) )

现场演示(打开交互模式)


推荐阅读