Символы, соответствующие регулярному выражению, в которых нет указанного пробела

#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] )(. )
  

Вы можете удалить любую группу () , которую пожелаете, и она все равно будет соответствовать.

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

Вы можете уменьшить границы, если хотите.