2016-07-12 20 views
2

Ich möchte zwei Regex in einer Zeile kombinieren.Wie man zwei re.compile regex in python3 kombiniert?

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

versuchte ich (|) Zeichen in einer Art und Weise re.compile('^http://' | '/news/') aber alles umsonst. Ich brauche beide Funktionalitäten (Verbindungen enthalten 'http' sowie /news/)

+0

Verwenden Sie 're.compile (r '^ http: // |/news /')' - wenn Sie eine ODER-Bedingung benötigen oder 're.compile (r '^ http: //.*/news/') 'zu' http' am Anfang und '/ news /' irgendwo in der Zeichenfolge. –

+0

Nein! Ich möchte UND Zustand. nicht ODER – user6575792

+0

Großartig, fügte ich beide Lösungen hinzu, aber ich sehe, dass ich recht hatte, als ich mich entschied, von Anfang an auf der UND-Bedingung zu verweilen. –

Antwort

1

Die Beantwortung der Frage:

ich zwei regex die in einer Linie verbinden wollen ... Ich brauche beide Funktionalitäten (Verbindungen enthalten 'http' sowie /news/)

ich verstehen und als als eine Voraussetzung für beide http und /news/ in der Zeichenfolge vorhanden sein. So können Sie eine einfache

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

verwenden Es wird http am Anfang übereinstimmen und /news/ Teilzeichenfolge irgendwo in der Zeichenkette.

Muster Details:

  • ^ - Beginn der Zeichenfolge
  • http:// - eine Folge von Literalen
  • .* - 0+ alle Zeichen aber eine neue Zeile
  • /news/ - Teilzeichenfolge /news/.

Makel zu bekommen Ergebnisse mit entwederhttp zu Beginn oder/news/ innen

Der | Wechsel Operator innerhalb der RegexMuster, nicht zwischen regex Mustern innerhalb re.compile verwendet wird:

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

Hier gehört ^ nur zu http (der erste Zweig).^http:// entspricht http:// am Zeichenanfang -OR- der /news Zweig entspricht /news/ irgendwo innerhalb der Zeichenfolge. So werden alle Werte zugeordnet, die entwederhttp am Anfang haben, oder /news/ innerhalb der Zeichenfolge.

0

Try this:

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

Was Sie versucht haben, fast richtig ist, re.compile('^http://' | '/news/'), nur setzte sie in einfache Anführungszeichen als: re.compile('^http://|/news/').

2

Sie brauchen nicht einen regulären Ausdruck, Sie CSS-Selektoren verwenden können:

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

^= suchen hrefs mit dem Unter starrem, *= sucht hrefs, die den Teil überall enthalten.

+0

Können Sie die Selektoren in einem 'select' kombinieren? –

+0

@ WiktorStribiżew, ja, Sie können Komma trennen. –

+0

Aber heißt es "UND" oder "ODER"? –