Соответствие регулярному выражению, но re.match () ничего не возвращает - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь проанализировать файл .md, используя определенный шаблон с регулярным выражением в Python.Файл написан так:

## title
## title 2

### first paragraph
[lines]
...

### second
[lines]
...

## third 
[lines]
...

## last
[lines]
...

Так что я использовал это регулярное выражение, чтобы сопоставить его:

##(.*)\n+##(.*)\n+###((\n|.)*)###((\n|.)*)##((\n|.)*)##((\n|.)*)

, когда я пробую его в сети, совпадение с регулярным выражением: https://regex101.com/r/8iYBrp/1

Но когда я использую его в Python, он не работает, я не могу понять, почему.

Вот мой код:

Вот мой код:

import re

str = (
    r'##(.*)\n+##(.*)\n+###((\n|.)*)###((\n|.)*)##((\n|.)*)##((\n|.)*)')
file_regexp = re.compile(str)

## Retrieve the content of the file (I am sure this part 
## returns what I want)

m = file_regexp.match(fileContent)

# m is always None

Я уже пытался добавить флаги, такие как re.DOTALL, re.I, re.M, re.S.Но когда я делаю это, сценарий становится очень медленным, и мой компьютер начинает издавать странный шум.

Кто-нибудь знает, что я сделал не так?Любая помощь приветствуется

Ответы [ 3 ]

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

Прежде всего вы присваиваете свой шаблон регулярных выражений переменной str (переопределяет встроенную str), но впоследствии используете featureStr. Ваш полученный объект соответствия пуст, потому что вы сказали ему игнорировать то, что он соответствует. Вы можете присвоить имена местозаполнителю регулярного выражения, используя ?P<name>, и получить к ним доступ позже. Вот рабочий пример:

import re

featureStr = (
    r'##(?P<title>.*)\n+##(?P<title_2>.*)\n+###(?P<first>(.*)###(?P<second>(.*)##(?P<third>(.*)##(.*)')
file_regexp = re.compile(featureStr, re.S)

fileContent = open("markdown.md").read()

m = file_regexp.match(fileContent)

print(m.groupdict())

Какие отпечатки:

{'title': ' title', 'title_2': ' title 2', 'first': ' first paragraph\n[lines]\n...\n\n', 'second': ' second\n[lines]\n...\n\n', 'third': ' third \n[lines]\n...\n\n'}

Надеюсь, это поможет вам. Дайте мне знать, если остались какие-либо вопросы. Хорошего дня!

0 голосов
/ 20 июня 2019

Используйте re.search вместо re.match.

str = (r'##(.*?)\n##(.*?)\n+###(.*?)\n+###(.*?)\n+##(.*?)\n+##(.*?)')
file_regexp = re.compile(str, re.S)

fileContent = '''
## title
## title 2

### first paragraph
[lines]
...

### second
[lines]
...

## third 
[lines]
...

## last
[lines]
...
'''

m = file_regexp.search(fileContent)
print(m.groups())

Выход:

(' title', ' title 2', ' first paragraph\n[lines]\n...', ' second\n[lines]\n...', ' third \n[lines]\n...', '')
0 голосов
/ 20 июня 2019

Поправьте меня, если я ошибаюсь, но если вас интересуют только строки, вы можете просто пропустить строки, начинающиеся с #. Это может быть решено с помощью чего-то вроде

with open("/path/to/your/file",'r') as in_file:
   for line in in_file:
       if line.startswith('#'):
          continue
       else:
          do something here.

Зачем вам нужно регулярное выражение?

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