Регулярное выражение, соответствующее многострочному блоку текста

Разве вы не можете просто передать URL в функцию fetch в качестве параметра? Таким образом, подпись для fetch становится такой:

Future fetch(String url) {
// do stuff
}

Если вы хотите передать значение по умолчанию, синтаксис немного отличается:

Future fetch({String url = "http://default"}) {
// do stuff
}

И тогда вызывающая сторона может выбрать: передать URL или нет.

Помните, что Flutter написан на Dart, так что в конечном итоге вы просто пишете код для дротиков. Для вопросов, связанных с языком (например, как передать параметры в функции), языковой тур является отличным ресурсом.

85
задан martineau 18 March 2017 в 15:20
поделиться

5 ответов

Попробуйте это:

re.compile(r"^(.+)\n((?:\n.+)+)", re.MULTILINE)

я думаю, что Ваша самая большая проблема состоит в том, что Вы ожидаете ^ и $ привязки соответствовать переводам строки, но они не делают. В многострочном режиме, ^ соответствия положение сразу после новая строка и $ соответствия положение сразу предшествование новая строка.

знать также, что новая строка может состоять из перевода строки (\n), возврат каретки (\r), или carriage-return+linefeed (\r\n). Если Вы не уверены, что Ваш целевой текст использует только переводы строки, необходимо использовать эту более содержащую версию regex:

re.compile(r"^(.+)(?:\n|\r\n?)((?:(?:\n|\r\n?).+)+)", re.MULTILINE)

BTW, Вы не хотите использовать модификатор DOTALL здесь; Вы полагаетесь на то, что точка соответствует всему кроме новые строки.

104
ответ дан Alan Moore 24 November 2019 в 08:22
поделиться

Это будет работать:

>>> import re
>>> rx_sequence=re.compile(r"^(.+?)\n\n((?:[A-Z]+\n)+)",re.MULTILINE)
>>> rx_blanks=re.compile(r"\W+") # to remove blanks and newlines
>>> text="""Some varying text1
...
... AAABBBBBBCCCCCCDDDDDDD
... EEEEEEEFFFFFFFFGGGGGGG
... HHHHHHIIIIIJJJJJJJKKKK
...
... Some varying text 2
...
... LLLLLMMMMMMNNNNNNNOOOO
... PPPPPPPQQQQQQRRRRRRSSS
... TTTTTUUUUUVVVVVVWWWWWW
... """
>>> for match in rx_sequence.finditer(text):
...   title, sequence = match.groups()
...   title = title.strip()
...   sequence = rx_blanks.sub("",sequence)
...   print "Title:",title
...   print "Sequence:",sequence
...   print
...
Title: Some varying text1
Sequence: AAABBBBBBCCCCCCDDDDDDDEEEEEEEFFFFFFFFGGGGGGGHHHHHHIIIIIJJJJJJJKKKK

Title: Some varying text 2
Sequence: LLLLLMMMMMMNNNNNNNOOOOPPPPPPPQQQQQQRRRRRRSSSTTTTTUUUUUVVVVVVWWWWWW
<час>

Некоторое объяснение об этом регулярном выражении могло бы быть полезным: ^(.+?)\n\n((?:[A-Z]+\n)+)

  • первый символ (^) означает "запускаться в начале строки". Знайте, что это не соответствует самой новой строке (то же за $: это означает "незадолго до новой строки", но это не соответствует самой новой строке).
  • Тогда (.+?)\n\n означает "соответствие как можно меньше символов (все символы позволяются), пока Вы не достигаете двух новых строк". Результат (без новых строк) помещается в первую группу.
  • [A-Z]+\n означает "соответствие как можно больше прописных букв, пока Вы не достигаете новой строки. Это определяет то, что я назову textline.
  • ((?: средства textline)+) соответствуют одному или нескольким textlines, но не помещают каждую строку в группу. Вместо этого поместите весь textlines в одной группе.
  • Вы могли добавить финал \n в регулярном выражении, если Вы хотите осуществить двойную новую строку в конце.
  • кроме того, если Вы не уверены в том, какую новую строку Вы получите (\n или \r или \r\n) тогда просто, фиксируют регулярное выражение путем замены каждого возникновения [1 111] [1 112].
20
ответ дан MiniQuark 24 November 2019 в 08:22
поделиться

Если бы каждый файл только имеет одну последовательность аминокислот, я не использовал бы регулярные выражения вообще. Просто что-то вроде этого:

def read_amino_acid_sequence(path):
    with open(path) as sequence_file:
        title = sequence_file.readline() # read 1st line
        aminoacid_sequence = sequence_file.read() # read the rest

    # some cleanup, if necessary
    title = title.strip() # remove trailing white spaces and newline
    aminoacid_sequence = aminoacid_sequence.replace(" ","").replace("\n","")
    return title, aminoacid_sequence
6
ответ дан MiniQuark 24 November 2019 в 08:22
поделиться

найдите:

^>([^\n\r]+)[\n\r]([A-Z\n\r]+)

\1 = some_varying_text

\2 = строки всех заглавных букв

Редактирование (доказательство, что это работает):

text = """> some_Varying_TEXT

DSJFKDAFJKDAFJDSAKFJADSFLKDLAFKDSAF
GATACAACATAGGATACA
GGGGGAAAAAAAATTTTTTTTT
CCCCAAAA

> some_Varying_TEXT2

DJASDFHKJFHKSDHF
HHASGDFTERYTERE
GAGAGAGAGAG
PPPPPAAAAAAAAAAAAAAAP
"""

import re

regex = re.compile(r'^>([^\n\r]+)[\n\r]([A-Z\n\r]+)', re.MULTILINE)
matches = [m.groups() for m in regex.finditer(text)]

for m in matches:
    print 'Name: %s\nSequence:%s' % (m[0], m[1])
3
ответ дан Jason Coon 24 November 2019 в 08:22
поделиться

Мое предпочтение.

lineIter= iter(aFile)
for line in lineIter:
    if line.startswith( ">" ):
         someVaryingText= line
         break
assert len( lineIter.next().strip() ) == 0
acids= []
for line in lineIter:
    if len(line.strip()) == 0:
        break
    acids.append( line )

В этой точке у Вас есть someVaryingText как строка и кислоты как список строк. Можно сделать "".join( acids ) для создания единственной строки.

я нахожу это менее печальным (и более гибкий), чем мультилиния regexes.

1
ответ дан S.Lott 24 November 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: