Регулярное выражение для соответствия первому элементу последней строки - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть таблица в следующем формате:

# HEADER
 1.452000000E-08   9.999999956E+00
 2.407483818E-06   9.999999956E+00
 1.096959505E-05   9.999999956E+00
 2.215696736E-05   9.999999961E+00
 3.187463656E-05   9.999999977E+00
 4.121852471E-05   1.000000002E+01
 4.981256454E-05   1.000000009E+01
 5.768279362E-05   1.000000017E+01
 6.495080199E-05   1.000000026E+01
 7.173653894E-05   1.000000035E+01
 7.813611913E-05   1.000000044E+01
 8.422150607E-05   1.000000053E+01
 9.004513021E-05   1.000000062E+01
 9.564467570E-05   1.000000071E+01
 1.010469937E-04   1.000000079E+01
 1.062711251E-04   1.000000087E+01
 1.113306207E-04   1.000000095E+01
 1.162353387E-04   1.000000103E+01
 1.209928265E-04   1.000000110E+01
 1.256093412E-04   1.000000116E+01
 1.300905579E-04   1.000000123E+01
 1.344420136E-04   1.000000128E+01
 1.386693389E-04   1.000000134E+01
 1.427783330E-04   1.000000138E+01
 1.467749408E-04   1.000000143E+01

Я точно не знаю количество строк, но я бы хотел сопоставить первый элемент последней строки (в идеале, я также получить другие элементы для файлов с большим количеством столбцов). В данном случае это число 1.467749408E-04.

. Я могу сопоставить последнюю строку с ^[[:blank:]][-+]?\d*\.?\d+[eE][-+]?\d+(.*)\z или первый столбец с ^[[:blank:]][-+]?\d*\.?\d+[eE][-+]?\d+, но я не могу понять, как получить первый элемент только или сделайте AND, которое работает с обоими этими условиями.

1 Ответ

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

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

^.*(\d+\.\d+E[+-]\d+)\s+\d+\.\d+E[+-]\d+$

Демо

Шаблон работает следующим образом:

^                       from the start of the text
    .*                  consume everything, across lines, until reaching
    (\d+\.\d+E[+-]\d+)  the second to last number (capture this in $1)
    \s+                 followed by whitespace
    \d+\.\d+E[+-]\d+    the last number
$                       the end of the text

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

Вот скрипт Pythons, который должен работать:

inp = """# HEADER
1.452000000E-08   9.999999956E+00
...
1.467749408E-04   1.000000143E+01"""

matches = re.findall(r'^.*(\d+\.\d+E[+-]\d+)\s+\d+\.\d+E[+-]\d+$', inp,
                     flags=re.DOTALL)
print(matches[0])

Это печатает:

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