регулярное выражение захвата информации в текстовом файле после нескольких пустых строк - PullRequest
1 голос
/ 25 июня 2019

Я открываю сложный текстовый файл в python, сопоставляю все остальное, что мне нужно, с регулярным выражением, но застрял в одном поиске.

Я хочу захватить числа после строки «начать отсюда». Пространство между двумя рядами важно и планируется разделить позже.

start after here: test


5.7,-9.0,6.2

1.6,3.79,3.3

Код:

text = open(r"file.txt","r") 
for line in text:
    find = re.findall(r"start after here:[\s]\D+.+", line) 

Я попробовал это здесь https://regexr.com/ и, похоже, работает, но это для Java.

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

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Шаблон start after here:[\s]\D+.+ соответствует буквенным словам, а затем символу пробела, используя [\s] (вы можете опустить скобки).

Тогда 1+ раз ни одна цифра не совпадает, что будет соответствовать до 5.7. Затем 1+ раз будет сопоставлен любой символ, кроме новой строки, который будет соответствовать 5.7,-9.0,6.2 Он не будет соответствовать следующей пустой строке и следующей строке.

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

\bstart after here:.*[\r\n]+(\d+\.\d+.*(?:[\r\n]+[ \t]*\d+\.\d+.*)*).*

Значения, включая пустую строку, находятся в первой группе захвата.

Например

import re

regex = r"\bstart after here:.*[\r\n]+(\d+\.\d+.*(?:[\r\n]+[ \t]*\d+\.\d+.*)*).*"

test_str = ("start after here: test\n\n\n"
    "5.7,-9.0,6.2\n\n"
    "1.6,3.79,3.3\n")

matches = re.findall(regex, test_str)

print(matches)

Результат

['5.7,-9.0,6.2\n\n1.6,3.79,3.3']

Regex demo | Python demo

Если вы хотите сопоставить десятичные дроби (или только одну или несколько цифр) перед запятой, вы можете разделить на 1 или несколько символов новой строки и использовать:

[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?=,|$)

Regex demo

0 голосов
/ 25 июня 2019
import re

test_str = ("start after here: test\n\n\n"
    "5.7,-9.0,6.2\n\n"
    "1.6,3.79,3.3\n")


m = re.search(r'start after here:([^\n])+\n+(.*)', test_str)
new_str = m[2]
m = re.search(r'(-?\d*\.\d*,?\s*)+', new_str)
print(m[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...