Сопоставление регулярных выражений с возвратами каретки в Python

#python #regex

#python #регулярное выражение

Вопрос:

У меня есть следующие данные, и я хочу сопоставить определенные строки, как указано ниже.

 FTUS80 KWBC 081454 AAArr TAF AMD   #should match 'AAA'
LTUS41 KCTP 082111 RR3rr TMLLNSr  #should match 'RR3' and 'TMLLNS'
SRUS55 KSLC 082010rr HM5SLCrr    #should match 'HM5SLC'
SRUS55 KSLC 082010rr SIGC  rr    #should match 'SIGC  ' including whitespace
 

Мне нужно, чтобы были выполнены следующие условия. Но это не работает, когда я собираю все это воедино, поэтому я знаю, что у меня есть ошибки. Заранее благодарю.

  • Начать совпадение после 6-значной строки: (?<=d{6})
  • совпадение, если 3 символа смешали прописные буквы / цифры и перед первыми 2 возвратами каретки: ([A-Z0-9]{3})(?= р)
  • совпадение, если 6 символов смешали прописные буквы / цифры после возврата каретки: (?<=rr[A-Z0-9]{6})
  • совпадение, если 4 символа и два пробела: ([A-Z0-9]{4} )

Комментарии:

1. Являются r ли символы в вашем примере данных репрезентативными для фактического возврата каретки или вы получаете фактические символы r , возвращаемые в качестве заполнителей для возврата каретки в исходных данных?

2. @benvc фактические кредиты.

Ответ №1:

Вероятно, есть более элегантный способ, но вы могли бы сделать что-то вроде следующего:

 (?:d{6}s?)([A-Zd]{3})?(?:[rn]{2}s)([A-Zd]{6}|[A-Zd]{4}s{2})?
 
  • (?:d{6}s?) группа из 6 цифр, за которыми следует необязательный пробел
  • ([A-Zd]{3})? необязательная группа захвата из 3 прописных букв / цифр
  • (?:[rn]{2}s) группа без захвата из двух окончаний строк за которыми следует 1 пробел
  • ([A-Zd]{6}|[A-Zd]{4}s{2})? необязательная группа захвата, состоящая либо из 6 заглавных букв / цифр, либо из 4 заглавных букв / цифр, за которыми следуют 2 пробела

Комментарии:

1. Что делать, если существует более 2 возвратов каретки, например, ссылка ? Он не соответствует 2 CRS, поэтому я вставил 4, и это вроде как работает, но все равно не соответствует ‘SIGC’. Как учитываются кредиты?

2. @klex52s — если количество пробелов, возврат каретки, окончания строк не совпадают, используйте менее точный квантификатор. Что-то вроде: (?:d{6}s*)([A-Zd]{3})?(?:[rns] )([A-Zd]{6}|[A-Zd]{4}s{2})?

Ответ №2:

Неясно, какой здесь конец строки, но предполагая, что это Unix one n , следующее выражение захватывает строки в соответствии с запросом (двойные кавычки добавлены для отображения пробелов)

 sed -rne 's/^.{18} ?([A-Z0-9]{3,3})?r{2}?([^r] )?r.*$/"12"/p' text.txt
 

Результат

 "AAA"
"RR3 TMLLNS"
" HM5SLC"
" SIGC  "
 
  • .{18} первые 18 символов
  • ?([A-Z0-9]{3,3})? соответствует AAA или RR3 без начального пробела
  • r{2}?([^r] )?r совпадает TMLLNS , HM5SLC или SIGC перед ним 2 r символа, а за ними 1 r символ.