Выберите Northings из 1 строки - PullRequest
1 голос
/ 06 апреля 2020

У меня есть следующая строка:

Start: 738392E, 6726376N

Я извлек 738392 ок, используя (?<=.art\:\s)([0-9A-Z]*). Это дало мне совпадение в одной группе, что позволило мне извлечь его в виде значения столбца

enter image description here.

Я хочу извлечь 6726376 таким же образом. Появляется только одна группа, потому что я анализирую это значение столбца.

Не уверен, почему (?=(art\:\s\s*))(?=[,])*(.*[0-9]*) дает мне всю строку после S.

enter image description here

Помогите мне понять это правильно с объяснением будет go по пути.

Ответы [ 3 ]

4 голосов
/ 06 апреля 2020

Потому что вы использовали позитивные взгляды. Они просто делают некоторые утверждения, но не «двигают головой».

(?=(art\:\s\s*)) гарантирует, что вы до «art: ...». Следующее - еще один позитивный взгляд, который вы количественно определяете звездочкой, чтобы сделать его необязательным. Наконец, вы сопоставляете что-нибудь, поэтому вы получаете остаток строки в вашей группе захвата.

Я предлагаю более простое регулярное выражение:

(?<=(art\:\s))(\d+)\D+(\d+)

Демо

Сначала мы делаем положительный обзор, который гарантирует, что мы после"art:", затем мы сопоставляем два числа, разделенных не числами.

2 голосов
/ 06 апреля 2020

Вам не нужно усложнять это. Просто используйте что-то вроде

Start: (\d+)E, (\d+)N

или

\b\d+(?=[EN]\b)

, если вам нужно сопоставить каждый бит отдельно.

У вашего выражения (?=(art\:\s\s*))(?=[,])*(.*[0-9]*) есть несколько проблем, помимо уже существующих упомянуто: 1) ваш первый и второй матчевые взгляды в разных местах, 2) ваш второй прогнозный взгляд количественно, что, за 25 лет, я никогда не видел, чтобы кто-то делал, так что слава. ;), 3) ваша группа захвата соответствует чему угодно, включая любую строку или пустую строку.

1 голос
/ 06 апреля 2020

Вы соответствуете всей части после нее, потому что вы используете .*, которая будет соответствовать до конца строки.

Обратите внимание, что эта часть [0-9]* в конце шаблона не совпадает, потому что она не является обязательным, и предыдущий .* уже совпадает до конца строки.

Вы можете получить совпадение без каких-либо обходных путей:

(art:\s)(\d+)[^,]+,\s(\d+)

Regex demo


Если вы хотите только совпадения, вы можете использовать модуль регулярных выражений PyPi

(?<=\bStart:(?:\s+\d+[A-Z],)* )\d+(?=[A-Z])

Демонстрация регулярных выражений (например, только с использованием другого движка) | Python демо

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