wake-up-neo.net

Der reguläre Ausdruck von Python stimmt mit dem ganzen Wort überein

Ich habe Probleme, den richtigen regulären Ausdruck für das folgende Szenario zu finden:

Sagen wir:

a = "this is a sample"

Ich möchte ganzes Word abgleichen - zum Beispiel muss "hi" False zurückgeben, da "hi" kein Word ist und "is" True zurückgeben soll, da links und rechts kein Alpha-Zeichen steht.

27
user2161049

Versuchen

re.search(r'\bis\b', your_string)

Von den Dokumenten :

\ b Stimmt mit der leeren Zeichenfolge überein, jedoch nur am Anfang oder Ende eines Wortes. 

Beachten Sie, dass das Modul re eine naive Definition von "Word" als "Sequenz von alphanumerischen Zeichen oder Unterstrichen" verwendet, wobei "alphanumerisch" vom Gebietsschema oder von Unicode-Optionen abhängt.

Beachten Sie auch, dass \b ohne das rohe Zeichenkettenpräfix als "Rücktaste" anstelle der regulären Word-Grenze angezeigt wird.

34
georg

Versuchen Sie es mit der Zeichenklasse "Wortgrenze" im Regex-Modul, re:

x="this is a sample"
y="this isis a sample."
regex=re.compile(r"\bis\b")  # For ignore case: re.compile(r"\bis\b", re.IGNORECASE)

regex.findall(y)
[]

regex.findall(x)
['is']

Aus der Dokumentation von re.search() .

\b stimmt mit der leeren Zeichenfolge überein, jedoch nur am Anfang oder Ende eines Words

...

Zum Beispiel entspricht r'\bfoo\b''foo', 'foo.', '(foo)', 'bar foo baz', jedoch nicht 'foobar' oder 'foo3'.

2
Om Prakash

Ich denke, dass das vom OP gewünschte Verhalten mit den gegebenen Antworten nicht vollständig erreicht wurde. Insbesondere wurde die gewünschte Ausgabe eines Boolean nicht erreicht. Die Antworten do helfen, das Konzept zu veranschaulichen, und ich denke, dass sie hervorragend sind. Vielleicht kann ich veranschaulichen, was ich meine, indem ich sage, dass ich glaube, dass das OP die aus folgenden Gründen verwendeten Beispiele verwendet hat.

Die gegebene Zeichenfolge war, 

a = "this is a sample" 

Das OP erklärte dann:

Ich möchte ganzes Word abgleichen - zum Beispiel muss "hi"False zurückgeben, da "hi" kein Word ist ...

Soweit ich weiß, bezieht sich der Verweis auf das Such-Token "hi", wie es im Word "this" gefunden wird. Wenn jemand den String a nach Word"hi" durchsucht, sollte er False als Antwort erhalten.

Das OP geht weiter,

... und "is" sollten True zurückgeben, da links und rechts kein Alpha-Zeichen vorhanden ist.

In diesem Fall bezieht sich der Verweis auf das Suchtoken "is", wie es im Word "is" gefunden wird. Ich hoffe, das hilft, Dinge zu klären, warum wir Word-Grenzen verwenden. Die anderen Antworten verhalten sich wie folgt: "Gib kein Wort zurück, es sei denn, dieses Wort wird von selbst gefunden - nicht innerhalb von anderen Wörtern." Die "Wortgrenze" Abkürzungsklasse erledigt diese Aufgabe gut.

Bisher wurde nur das Wort "is" in Beispielen verwendet. Ich denke, dass diese Antworten richtig sind, aber ich denke, dass es mehr grundlegende Bedeutung der Frage gibt, die angegangen werden muss. Das Verhalten anderer Suchzeichenfolgen sollte beachtet werden, um das Konzept zu verstehen. Mit anderen Worten, wir müssen generalisieren die (ausgezeichnete) Antwort von @georg mit re.match(r"\bis\b", your_string) verwenden. Das gleiche r"\bis\b"-Konzept wird auch in der Antwort von @OmPrakash verwendet, der die generalisierende Diskussion mit dem Zeigen begann

>>> y="this isis a sample."
>>> regex=re.compile(r"\bis\b")  # For ignore case: re.compile(r"\bis\b", re.IGNORECASE)
>>> regex.findall(y)
[]

Nehmen wir an, die Methode, die das von mir diskutierte Verhalten zeigen soll, wird benannt 

find_only_whole_Word(search_string, input_string)

Das folgende Verhalten sollte dann erwartet werden.

>>> a = "this is a sample"
>>> find_only_whole_Word("hi", a)
False
>>> find_only_whole_Word("is", a)
True

Wieder verstehe ich die Frage des OP. Wir haben mit der Antwort von @georg einen Schritt in Richtung dieses Verhaltens unternommen, aber es ist ein bisschen schwer zu interpretieren/umzusetzen. nämlich

>>> import re
>>> a = "this is a sample"
>>> re.search(r"\bis\b", a)
<_sre.SRE_Match object; span=(5, 7), match='is'>
>>> re.search(r"\bhi\b", a)
>>>

Der zweite Befehl gibt keine Ausgabe aus. Die nützliche Antwort von @OmPrakesh zeigt die Ausgabe, jedoch nicht True oder False.

Hier ist eine umfassendere Auswahl des zu erwartenden Verhaltens.

>>> find_only_whole_Word("this", a)
True
>>> find_only_whole_Word("is", a)
True
>>> find_only_whole_Word("a", a)
True
>>> find_only_whole_Word("sample", a)
True
# Use "ample", part of the Word, "sample": (s)ample
>>> find_only_whole_Word("ample", a)
False
# (t)his
>>> find_only_whole_Word("his", a)
False
# (sa)mpl(e)
>>> find_only_whole_Word("mpl", a)
False
# Any random Word
>>> find_only_whole_Word("applesauce", a)
False
>>>

Dies kann durch folgenden Code erreicht werden:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
#@file find_only_whole_Word.py

import re

def find_only_whole_Word(search_string, input_string):
  # Create a raw string with Word boundaries from the user's input_string
  raw_search_string = r"\b" + search_string + r"\b"

  match_output = re.search(raw_search_string, input_string)
  ##As noted by @OmPrakesh, if you want to ignore case, uncomment
  ##the next two lines
  #match_output = re.search(raw_search_string, input_string, 
  #                         flags=re.IGNORECASE)

  no_match_was_found = ( match_output is None )
  if no_match_was_found:
    return False
  else:
    return True

##endof:  find_only_whole_Word(search_string, input_string)

Eine einfache Demonstration folgt. Führen Sie den Python-Interpreter in demselben Verzeichnis aus, in dem Sie die Datei gespeichert haben, find_only_whole_Word.py.

>>> from find_only_whole_Word import find_only_whole_Word
>>> a = "this is a sample"
>>> find_only_whole_Word("hi", a)
False
>>> find_only_whole_Word("is", a)
True
>>> find_only_whole_Word("cucumber", a)
False
# The excellent example from @OmPrakash
>>> find_only_whole_Word("is", "this isis a sample")
False
>>>
0
bballdave025