正则表达式以匹配特定行中的数字

时间:2018-12-07 16:24:12

标签: regex

我有以下字符串:

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)(?:[^;\d])*(\d)(?:[^;\d])*(\d)

但是正如您所看到的,我在小组中的重复达到了我的目标

(?:[^;\d])*

如果我尝试使用乘法器执行此操作,它将仅捕获最后一个数字,而我需要所有数字。据我所知,没有解决方案,但是stackoverflow不允许我删除此问题。 我正在使用regex101进行检查。

2 个答案:

答案 0 :(得分:0)

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

[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) )

Live Demo(将互动模式打开

答案 1 :(得分:0)

一种perl方式:

#!/usr/bin/perl
use Modern::Perl;

my @fruits = (
    'Apple---a---1---d---2',
    'Pear---b---3---e---4',
    'Melon---c---9---f---8',
);
my %fruits;
/^(\w+)\D+(\d+)\D+(\d+)/ and @{$fruits{$1}} = ($2, $3) for @fruits;
while (1) {
    my $in = <>;
    chomp $in;
    last if $in eq 'exit';
    say "@{$fruits{$in}}" if exists $fruits{$in};
}

运行:

perl test.pl 
Pear
3 4
blah
Melon
9 8
exit