объединение нескольких регулярных выражений - PullRequest
2 голосов
/ 29 сентября 2019

У меня есть текстовый файл, который содержит следующие строки

 ! 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 ]

3 голосов
/ 29 сентября 2019

Это должно получить все необходимое в одном регулярном выражении

([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)
0 голосов
/ 29 сентября 2019

Может быть,

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

может быть близко к тому, что вы хотели бы написать.

Демонстрация

Тест

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 . Если хотите, вы также можете посмотреть в этой ссылке , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...