#python #regex
#python #регулярное выражение
Вопрос:
Мое регулярное выражение также можно найти здесь, хотя я вручную вставил символы для поиска возврата каретки.
((?:d{6}?)([A-Zd]{3})?(?:[^r ] )(([A-Zd]{6}|[A-Zd]{5} |[A-Zd]{4} ))?)
Я указал пробел после строки из 5 и 4 символов, но все же мое регулярное выражение, похоже, игнорирует его, по крайней мере, в первой строке. Он соответствует «EXTEND», хотя я этого не хочу. Только если после этого есть пробел. Это работает в третьей строке, хотя и с «XOBUS».
FPCN54 CWNT 080810^r^r EXTENDED FORE #should not match anything
ASUS42 KMHX 080425^r^r RWRMHX^r^r WEAT #should match RWRMHX
RXUS30 KWNO 081300^r^r XOBUS ^r^r GREA #should match XOBUS w/ 1 trailing space
FXUS64 KEWX 081112 RR3^r^r AFDEWX^r^r #should match RR3 and AFDEWX
Редактировать: Забыл включить 3 символа буквенно-цифровой формы перед первым возвратом каретки. Смотрите строку 4. Это также необходимо зафиксировать.
Комментарии:
1. Лучше явно указать, в чем идея вашего регулярного выражения (оно должно соответствовать 4-му слову, за которым следует ^ r ^ r или что-то в этом роде, да?). Потому что возможным авторам ответов не так легко анализировать регулярные выражения (особенно, если в них есть какая-либо ошибка).
2. @Sanyash После 6-значной строки она должна соответствовать либо 6-символьной буквенно-цифровой строке, либо 5-символьной буквенно-цифровой строке с пробелом, либо 4-символьной буквенно-цифровой строке с двумя пробелами.
Ответ №1:
Основываясь на вашем желаемом выводе выше, вы чрезмерно усложняете регулярное выражение. ** Кстати, выше вы сказали «строка из 5 или 4 символов», но в желаемом выводе у вас есть строка из «6» символов и строка из 3 символов.
>>> import re
>>> string = '''FPCN54 CWNT 080810^r^r EXTENDED FORE #should not match
anything
ASUS42 KMHX 080425^r^r RWRMHX^r^r WEAT #should match RWRMHX
RXUS30 KWNO 081300^r^r XOBUS ^r^r GREA #should match XOBUS w/ 1 trailing
space
FXUS64 KEWX 081112 RR3^r^r RR3555^r^r AFDEWX^r^r #should match RR3, RR3555, and AFDEWX'''
>>> re.findall('(?m)([d]*[A-Z] (?:[A-Z]*[d]*)*[s]*)[^r]{2,}', string)
#OUTPUT
['RWRMHX', 'XOBUS ', 'RR3', 'AFDEWX', 'RR3555']
Комментарии:
1. Я забыл, что мне также нужно сопоставить 3 символа буквенно-цифрового типа, если они включены, после 6-значной строки. Смотрите Редактирование.
2. @klex52s Кроме того, я предполагаю, что они должны начинаться с букв? Заглавные буквы?
3. На самом деле, есть несколько случаев, в которых он может начинаться с цифры!
4. Да, только заглавные буквы.
5. @klex52s Я отредактировал строку и создал новое регулярное выражение. Диапазоны, о которых вы публикуете, отчасти противоречивы. Вы можете поиграть с вышесказанным.
Ответ №2:
Это регулярное выражение может помочь вам выполнить точное совпадение и разделить ваши строковые входные данные на несколько групп, если / как вы хотите, и восстановить ваши целевые выходные данные:
([A-Z0-9]{6})s([A-Z]{4})s([0-9]{6})([^|r]) s([A-Z] )([^|rs] )(. )
Вы можете удалить любую группу ()
, которую пожелаете, и она все равно будет соответствовать.
Вы можете уменьшить границы, если хотите.