我有以下字符串:
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进行检查。
答案 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