如何在组中使用逻辑or(在python或bash中)?
编辑 我想从一个句子中提取一个序列,由以下内容组成:1个公司名称,0个或多个数字(字母),以及无线电字母表中的0、1或2个字母(alpha bravo charlie…)。 最多可以有5个数字,最多2个字母。 数字和字母总是一个序列:数字和字母不混合(不可能有“五个字母零”)。 在数字/字母序列中找不到任何单词(数字表示数字,字母表示字母除外) 所以我们有一个公司名称,最后是一包数字,最后是一包字母 一句话中可能会出现多次 为此,我必须使用包含所有无线电字母的组,这些字母之间用逻辑or分隔,数字也是如此 company.txt包含公司名称: 蓝宝石 空气代数 阿拉伯航空公司 txt包含一个句子,例如:AIR-NOSTRUM八七六四入境OVDIL-HUH到达一五零 我在bash中尝试过egrep:如何在组中使用逻辑or(在python或bash中)?,python,regex,bash,grep,Python,Regex,Bash,Grep,编辑 我想从一个句子中提取一个序列,由以下内容组成:1个公司名称,0个或多个数字(字母),以及无线电字母表中的0、1或2个字母(alpha bravo charlie…)。 最多可以有5个数字,最多2个字母。 数字和字母总是一个序列:数字和字母不混合(不可能有“五个字母零”)。 在数字/字母序列中找不到任何单词(数字表示数字,字母表示字母除外) 所以我们有一个公司名称,最后是一包数字,最后是一包字母 一句话中可能会出现多次 为此,我必须使用包含所有无线电字母的组,这些字母之间用逻辑or分隔,数字
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']这样的东西,而不是这两个输出
例如