2016-07-12 1 views
2

Я хочу объединить два регулярных выражения в одну строку.Как объединить два regepile regex в python3?

soup1=link.findAll('a', attrs={'href': re.compile('^http://')}) 
soup2=link.findAll('a', attrs={'href': re.compile("/news/")}) 

Я попытался (|) знак в пути re.compile('^http://' | '/news/'), но все напрасно. Мне нужно как функциональные возможности (ссылки, содержащие 'http', а также /news/)

+0

Используйте 're.compile (r '^ http: // |/news /')' - если вам нужно условие ИЛИ, или 're.compile (r '^ http: //.*/news/') 'для соответствия' http' в начале и '/ news /' где-то в строке. –

+0

Нет! Я хочу И условие. not OR – user6575792

+0

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

ответ

1

Отвечая на вопрос:

Я хочу, чтобы объединить два регулярных выражений в единую линию ... Мне нужно обе функциональные возможности (ссылки, содержащие 'http', а также /news/)

Я понимаю , а также как как требование как для http, так и для /news/, чтобы присутствовать в строке. Таким образом, вы можете использовать простой

re.compile(r'^http://.*/news/') 

Это будет соответствовать http в начале и /news/ подстроку где-то внутри строки. Подробнее

Pattern:

  • ^ - начало строки
  • http:// - последовательность буквенных символов
  • .* - 0+ любых символов, кроме символа новой строки
  • /news/ - подстрока /news/.

Чередование, чтобы получить результаты с либоhttp на старте или/news/ внутри

Оператор | Чередование используется внутри шаблона регулярных выражений, а не между ними регулярных выражений шаблонов внутри re.compile:

re.compile(r'^http://|/news/') 
        ^

Здесь ^ относится только к http (первая ветка).^http:// соответствует http:// при начале строки -OR- /news ответвление /news/ в любом месте внутри строки. Таким образом, все значения будут сопоставлены с либоhttp в начале, либо /news/ внутри строки.

0

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

re.compile(r'(^http://)|(/news/)')

Что вы пробовали почти правильно, re.compile('^http://' | '/news/'), просто поместите их в одинарные кавычки, как: re.compile('^http://|/news/').

2

Вам не нужно регулярное выражение, вы можете использовать CSS селекторов:

soup.select('a[href^=http://],a[href*=/news/]') 

^= ищет hrefs вытаращенный с подстрокой, *= ищет hrefs, которые содержат подстроку в любом месте.

+0

Можете ли вы объединить селекторы в одном 'select'? –

+0

@ WiktorStribiżew, да, вы можете запятую отдельно. –

+0

Но означает ли это 'AND' или' OR'? –

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