2012-01-24 2 views
0

Я хочу получить весь текст до тех пор, пока не будет! появляется. ПримерПовторение регулярного выражения python до определенного символа

some textwfwfdsfosjtortjk\n 
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf\n 
sfsgdfgdfgdgdfgdg\n 
! 

Число линий до! изменения, так что я не могу прописывай рег ехр как этот

"+\n^.+\n^.+" 

Я использую re.MULTLINE, но я должен использовать re.DOTALL?

Благодаря

ответ

4

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

index = str.find('!') 
if index > -1: 
    str = str[index:] # or (index+1) to get rid of the '!', too 
0

Посмотрите в «опережающий просмотр» для этого конкретного персонажа вы читаете, и соответствуют всей первой части в качестве шаблона вместо.

Я не знаю точно, как читатель регулярных выражений в Python отличается от Ruby, но вы можете играть с ним в rubular.com

Может быть что-то вроде:

([^!]*(?=\!)) 

(Только что попробовал это, кажется, работать)

+0

'[^.]' Соответствует любому символу, кроме '.'; Я не думаю, что это вы имели в виду. –

+0

Извините, да ... это тоже должно быть! – Relic

-1

re.DOTALL должно быть достаточно:

import re 
text = """some textwfwfdsfosjtortjk 
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf 
sfsgdfgdfgdgdfgdg 
!""" 
rExp = re.compile("(.*)\!", re.S) 
print rExp.search(text).groups()[0] 

some textwfwfdsfosjtortjk 
sdsfsdfsdfsdfsdfsdfsdfsfsfsdfsdfsdf 
sfsgdfgdfgdgdfgdg 
+0

-1 соответствует LAST '!', А не FIRST –

0

Он должен выполнить эту работу.

re.compile('(.*?)!', re.DOTALL).match(yourString).group(1) 
+0

-1 соответствует LAST '!', А не FIRST. MULTILINE не имеет значения. –

+0

@JohnMachin Удалена жадная часть. Спасибо, что сообщили. –

3

Так что вы хотите, чтобы соответствовать все, от начала ввода до (но не включая) первый ! характер? Это должно сделать это:

re.match(r'[^!]*', input) 

Если восклицательных знаков нет, это будет соответствовать всей строке. Если вы хотите, чтобы соответствовать только строки с ! в них, добавьте предпросмотр:

re.match(r'[^!]*(?=!)', input) 

Флаг MULTILINE не требуется, поскольку нет якоря (^ и $), и DOTALL не требуется, потому что есть нет точек.

+0

+1: он работает, он обращается к случаю «нет! В строке», он объясняет, почему MULTILINE и DOTALL не нужны. –

+0

Да, заставьте этого парня выступить в качестве консультанта по регулярному выражению! – kindall

0

Я думаю, вы делаете это более сложным, чем это должно быть. Ваш reg exp просто должен сказать «повторить (любой символ, кроме!), За которым следует!». Помните, что [^!] означает «любой символ, кроме!».

Так, например:

>>> import re 
>>> rexp = re.compile("([^!]*)!") 
>>> test = """sdasd 
... asdasdsa 
... asdasdasd 
... asdsadsa 
... !""" 
>>> rexp.findall(test) 
['sdasd\nasdasdsa\nasdasdasd\nasdsadsa\n'] 
>>> 
+0

MULTILINE НЕ требуется. –

+0

Совершенно верно, спасибо @JohnMachin – snim2

1

Следуя философии питон «Легче попросить прощения Than разрешения» (EAFP), я предлагаю вам создать подпрограмму, которая легко понять, а затем сохранить, если ваш смена разделителя.

SEPARATOR = u"!" 
def process_string(s): 
try: 
    return s[:s.index(SEPARATOR)] 
except ValueError: 
    return s 

Эта функция вернет строку с начала до, и не включает, независимо от того, что вы определили как разделитель. Если разделитель не найден, он вернет всю строку. Функция работает независимо от новых строк.Если ваш разделитель изменится, просто измените SEPARATOR, и вы хорошо пойдете.

ValueError исключение возникает, когда вы запрашиваете индекс символа не в строке (попробуйте его в командной строке:. "Hola".index("1") (поднимет ValueError: substring not found) Затем рабочий процесс предполагает, что большую часть времени вы ожидаете SEPARATOR характер для того, чтобы быть в строке, поэтому сначала вы делаете попытку, не спрашивая разрешения (если в строке находится SEPARATOR), если вы терпите неудачу (метод index вызывает ValueError), тогда вы просите прощения (верните строку как первоначально полученную). (EAFP) считается питоническим, когда он применяется, как и в этом случае.

Нет необходимости в регулярных выражениях, это простая проблема.

Смежные вопросы