#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
перед ним 2r
символа, а за ними 1r
символ.