【问题标题】:combining multiple regular expressions组合多个正则表达式
【发布时间】:2020-01-29 03:10:28
【问题描述】:

我有一个包含以下行的文本文件

 ! 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?'))

【问题讨论】:

  • 您到底想达到什么目的?检查格式(最好使用解析器),检索值(在空格上拆分)。就目前而言,您的表达方式复杂且容易出错。

标签: regex python-3.x typeerror


【解决方案1】:

这应该可以在一个正则表达式中得到你需要的一切

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

【讨论】:

    【解决方案2】:

    也许,

    !\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 中观看它如何与一些示例输入匹配。


    正则表达式电路

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多