结合多个正则表达式

时间:2019-09-29 17:12:08

标签: regex python-3.x typeerror

我有一个文本文件,其中包含以下几行

 ! R1    R(1,2)                1.0881        
 ! R2    R(1,3)                1.0881        
 ! R3    R(1,4)                1.0881      
 ! R4    R(1,5)                1.0881         
 ! A1    A(2,1,3)              109.4712         
 ! A2    A(2,1,4)              109.4712         
 ! A3    A(2,1,5)              109.4712         
 ! A4    A(3,1,4)              109.4712       
 ! A5    A(3,1,5)              109.4712         
 ! A6    A(4,1,5)              109.4712        
 ! D1    D(2,1,4,3)           -120.0           
 ! D2    D(2,1,5,3)            120.0            
 ! D3    D(2,1,5,4)           -120.0           
 ! D4    D(3,1,5,4)            120.0   

为匹配所有内容,我使用了两个不同的正则表达式。

RE1 = !\s\w(\d)\s+R\((\d),(\d+)\)\s+(\d\.\d+

RE2 = !\s\w(\d)\s+\w\((\d)+,\d,\d\)?,?\d?\s?\)\s+\d?\-?\d\d\d?.\d?\d?\d?\d?

如何组合这两个RE,以便代码检查RE中的一个。根据SO的一些帖子,我尝试使用'|'合并这两个表达式,但是我所有的尝试都导致了typeerror这是我的尝试之一:

 pattern = re.compile(re.compile(r'!\s\w(\d)\s+R\((\d),(\d+)\)\s+(\d\.\d+)') | re.compile(r'!\s\w(\d)\s+\w\((\d)+,\d,\d\)?,?\d?\s?\)\s+\d?\-?\d\d\d?.\d?\d?\d?\d?'))

2 个答案:

答案 0 :(得分:3)

这应该在一个正则表达式中满足您的所有需求

([A-Z])(\d+)\s+\1\((\d+(?:,\d+)*)\)\s+(-?\d+\.\d+)

https://regex101.com/r/bJdcSc/1

 ( [A-Z] )                     # (1)
 ( \d+ )                       # (2)
 \s+ \1 \( 
 (                             # (3 start)
      \d+ 
      (?: , \d+ )*
 )                             # (3 end)
 \) \s+ 
 ( -? \d+ \. \d+ )             # (4)

答案 1 :(得分:0)

也许

!\s+[A-Z](\d)\s{2,}[A-Z]\((\d+),(\d+)?,?(\d+)?,?(\d+)?,?\)\s{2,}(-?\d+\.\d*)

可能接近您喜欢写的东西。

Demo

测试

import re

regex = r"!\s+[A-Z](\d)\s{2,}[A-Z]\((\d+),(\d+)?,?(\d+)?,?(\d+)?,?\)\s{2,}(-?\d+\.\d*)"
string = """
 ! R1    R(1,2)                1.0881        
 ! R2    R(1,3)                1.0881        
 ! R3    R(1,4)                1.0881      
 ! R4    R(1,5)                1.0881         
 ! A1    A(2,1,3)              109.4712         
 ! A2    A(2,1,4)              109.4712         
 ! A3    A(2,1,5)              109.4712         
 ! A4    A(3,1,4)              109.4712       
 ! A5    A(3,1,5)              109.4712         
 ! A6    A(4,1,5)              109.4712        
 ! D1    D(2,1,4,3)           -120.0           
 ! D2    D(2,1,5,3)            120.0            
 ! D3    D(2,1,5,4)           -120.0           
 ! D4    D(3,1,5,4)            120.0 
"""

print(re.findall(regex, string))

输出

  

[('1','1','2','',','1.0881'),('2','1','3','','','1.0881' ),   ('3','1','4','',','1.0881'),('4','1','5','',','1.0881'),   ('1','2','1','3',','109.4712'),('2','2','1','4','',   '109.4712'),('3','2','1','5','','109.4712'),('4','3','1',   '4','','109.4712'),('5','3','1','5','','109.4712'),('6','4',   '1','5','','109.4712'),('1','2','1','4','3','-120.0'),('2',   '2','1','5','3','120.0'),('3','2','1','5','4','-120.0'),   (“ 4”,“ 3”,“ 1”,“ 5”,“ 4”,“ 120.0”)]


如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。


RegEx电路

jex.im可视化正则表达式:

enter image description here