如何在组中使用逻辑or(在python或bash中)?

如何在组中使用逻辑or(在python或bash中)?,python,regex,bash,grep,Python,Regex,Bash,Grep,编辑 我想从一个句子中提取一个序列,由以下内容组成:1个公司名称,0个或多个数字(字母),以及无线电字母表中的0、1或2个字母(alpha bravo charlie…)。 最多可以有5个数字,最多2个字母。 数字和字母总是一个序列:数字和字母不混合(不可能有“五个字母零”)。 在数字/字母序列中找不到任何单词(数字表示数字,字母表示字母除外) 所以我们有一个公司名称,最后是一包数字,最后是一包字母 一句话中可能会出现多次 为此,我必须使用包含所有无线电字母的组,这些字母之间用逻辑or分隔,数字

编辑

我想从一个句子中提取一个序列,由以下内容组成:1个公司名称,0个或多个数字(字母),以及无线电字母表中的0、1或2个字母(alpha bravo charlie…)。 最多可以有5个数字,最多2个字母。 数字和字母总是一个序列:数字和字母不混合(不可能有“五个字母零”)。 在数字/字母序列中找不到任何单词(数字表示数字,字母表示字母除外)

所以我们有一个公司名称,最后是一包数字,最后是一包字母

一句话中可能会出现多次

为此,我必须使用包含所有无线电字母的组,这些字母之间用逻辑or分隔,数字也是如此

company.txt包含公司名称:

蓝宝石

空气代数

阿拉伯航空公司

txt包含一个句子,例如:AIR-NOSTRUM八七六四入境OVDIL-HUH到达一五零

我在bash中尝试过egrep:

company = cat company.txt | tr  '\n' '|'

number = "ZERO |ONE |TWO |TREE |THREE |FOUR |FIVE |SIX |SEVEN |EIGHT |NINER |NINE |TEN "

letter = "ALPHA |BRAVO |CHARLIE |DELTA |ECHO |FOXTROT |GOLF |HOTEL |INDIA |JULIET |KILO |LIMA |MIKE |NOVEMBER |OSCAR |PAPA |QUEBEC |ROMEO |SIERRA |TANGO |UNIFORM |VICTOR |WHISKEY |XRAY |YANKEE |ZULU "

egrep "($company) ($number)*($letter)*" --only-matching sentence.txt
例句:空中加油机八七六四进港奥维迪-哈达到一五零

输出为:AIR-NOSTRUM八七六四

一五零

第一个结果是预期的结果,但为什么我有“一五零”? 它应该只找到第一个,因为我想在这里提取一个包含1个公司、0个或多个数字以及0个或多个字母的序列

我还使用模块re在python3中进行了尝试,第一个模块只有数字:

re.findall("(ONE |FIVE |ZERO )*",'HELLO ZERO ONE FIVE ZERO ALPHA BRAVO TURN LEFT FIVE ZERO')

output : ['', '', '', '', '', '', 'ZERO ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
我想要输出序列:['ZERO-1-5-ZERO']和序列['FIVE-ZERO'](但不是['ZERO-1-5-0']) 是否可以使用模块re执行我正在尝试的操作? 在这里,我尝试只使用数字,但目标是添加公司类别和字母类别

有人能解释一下我在这些案件中做错了什么吗? pythonre的输出完全不是我所期望的,而对于egrep,我有一个不应该出现的匹配项,对此我感到非常困惑


谢谢

*
弄乱了python中的正则表达式:

>>重新导入
>>>s=“你好,零一五零阿尔法布拉沃左转”
>>>f=re.findall(((一|五|零)”,s)
>>>f
[‘零’、‘一’、‘五’、‘零’]
>>>t=''。连接(f)
>>>t
“零一五零”
或者在bash中:

$ echo "HELLO ZERO ONE FIVE ZERO ALPHA BRAVO TURN LEFT" | grep -Eo '(ONE |FIVE |ZERO )' | tr -d '\n'
ZERO ONE FIVE ZERO
编辑:
在这种情况下,您可以使用“限制重复”,其中语法为
{min,max}

>>重新导入
>>>a=[“空中飞车八七六四进港奥维迪-哈达到一五零”,
“空中传闻八七六四阿尔法入境OVDIL HUH到达一五零”,
“空中传声筒八七六四九阿尔法麦克进站奥维迪-哈达到一五零”,
“空中传声筒八六九阿尔法麦克进港奥维迪-哈达到一五零”,
“空中传声筒麦克进站奥维迪尔-哈达到1/5”,
“八七六麦克进站OVDIL啊达到了一五零”]
>>>company=“AIR-NOSTRUM |随便什么”
>>>number=“一|二|三|四|五|六|七|八|九|十”
>>>letter=“ALPHA | BRAVO | CHARLIE | DELTA | ECHO |狐步舞|高尔夫|酒店|印度|朱丽叶|基洛|利马|迈克|十一月|奥斯卡|爸爸|魁北克|罗密欧|谢拉|探戈|制服|维克多|威士忌X射线|扬基|祖鲁”
>>>r=“(“+company+”{0,1}[\t]*(((“+number+”){0,5})[\t]*((“+letter+”){0,2})”
>>>f=[]
>>>对于我来说,在一个:
...     t=re.findall(r,i)
...     如果len(t)>0:
...        如果len(t[0])>0:
...            f、 追加(t[0][0])
... 
>>>f
['AIR-NOSTRUM八七六四','AIR-NOSTRUM八七六四阿尔法','AIR-NOSTRUM八七六四九阿尔法麦克','AIR-NOSTRUM八六九阿尔法麦克','AIR-NOSTRUM麦克','八七六麦克']
你应该退房。这对我学习Regex有很大帮助

编辑:

见上面的例子。诀窍是创建一个重复0到1次的组:
(公司a |公司b){0,1}

*
在python中弄乱了正则表达式:

>>重新导入
>>>s=“你好,零一五零阿尔法布拉沃左转”
>>>f=re.findall(((一|五|零)”,s)
>>>f
[‘零’、‘一’、‘五’、‘零’]
>>>t=''。连接(f)
>>>t
“零一五零”
或者在bash中:

$ echo "HELLO ZERO ONE FIVE ZERO ALPHA BRAVO TURN LEFT" | grep -Eo '(ONE |FIVE |ZERO )' | tr -d '\n'
ZERO ONE FIVE ZERO
编辑:
在这种情况下,您可以使用“限制重复”,其中语法为
{min,max}

>>重新导入
>>>a=[“空中飞车八七六四进港奥维迪-哈达到一五零”,
“空中传闻八七六四阿尔法入境OVDIL HUH到达一五零”,
“空中传声筒八七六四九阿尔法麦克进站奥维迪-哈达到一五零”,
“空中传声筒八六九阿尔法麦克进港奥维迪-哈达到一五零”,
“空中传声筒麦克进站奥维迪尔-哈达到1/5”,
“八七六麦克进站OVDIL啊达到了一五零”]
>>>company=“AIR-NOSTRUM |随便什么”
>>>number=“一|二|三|四|五|六|七|八|九|十”
>>>letter=“ALPHA | BRAVO | CHARLIE | DELTA | ECHO |狐步舞|高尔夫|酒店|印度|朱丽叶|基洛|利马|迈克|十一月|奥斯卡|爸爸|魁北克|罗密欧|谢拉|探戈|制服|维克多|威士忌X射线|扬基|祖鲁”
>>>r=“(“+company+”{0,1}[\t]*(((“+number+”){0,5})[\t]*((“+letter+”){0,2})”
>>>f=[]
>>>对于我来说,在一个:
...     t=re.findall(r,i)
...     如果len(t)>0:
...        如果len(t[0])>0:
...            f、 追加(t[0][0])
... 
>>>f
['AIR-NOSTRUM八七六四','AIR-NOSTRUM八七六四阿尔法','AIR-NOSTRUM八七六四九阿尔法麦克','AIR-NOSTRUM八六九阿尔法麦克','AIR-NOSTRUM麦克','八七六麦克']
你应该退房。这对我学习Regex有很大帮助

编辑:

见上面的例子。诀窍是创建一个重复0到1次的组:
(公司a |公司b){0,1}

事实上,在python中,我无法正确添加字母和公司名称:

 re.findall("(ONE |FIVE |ZERO )(ALPHA |BRAVO )",'HELLO ZERO ONE FIVE ZERO ALPHA BRAVO TURN LEFT ONE ')

[('ZERO ', 'ALPHA ')]


>>> re.findall("(ONE |FIVE |ZERO )*(ALPHA |BRAVO )",'HELLO ZERO ONE FIVE ZERO ALPHA BRAVO TURN LEFT ONE ')

[('ZERO ', 'ALPHA '), ('', 'BRAVO ')] 
我想要像['0115zero ALPHA-BRAVO']或['ZERO','ONE','FIVE','ZERO','ALPHA','BRAVO']这样的东西,而不是这两个输出

例如