【问题标题】:Python Find entire word in string using regex and user inputPython使用正则表达式和用户输入在字符串中查找整个单词
【发布时间】:2017-08-15 15:49:15
【问题描述】:

我正在尝试使用正则表达式准确查找整个单词,但我正在搜索的单词是来自用户输入的变量值。我试过这个:

regex = r"\b(?=\w)" + re.escape(user_input) + r"\b"
if re.match(regex, string_to_search[i], re.IGNORECASE):
      <some code>...

但它匹配字符串的每次出现。它匹配正确的“var”->“var”,但也匹配“var”->“var”iable,我只希望它匹配“var”->“var”或“string”->“string”

输入:“剑”

String_to_search = "曾经有一个剑匠造剑"

期望的输出:将“sword”匹配到“sword”而不是“swordsmith”

【问题讨论】:

  • 请发布您的输入和所需的输出。
  • 好吧,\bvar\b 无法匹配 variable 中的 var。你为什么使用re.match?如果您想将用户输入作为一个完整的字符串进行匹配,您可以使用regex = '{}$'.format(re.escape(user_input)),然后使用re.match()。否则,如果您真的需要在较大的字符串中找到 var 作为整个单词,您将需要 re.search\bvar\b 正则表达式。
  • 难道python没有像子字符串搜索这样的非正则表达式函数吗?
  • 如果python支持条件,你可以把它包装到条件边界的(?(?=\w)\b)(?: your literal )(?(?&lt;=\w)\b)中,而这个\b(?=\w)强制文字以\w开头
  • @sln 是的,但它会在我不想要的变量中找到任何子字符串,包括“var”。我将尝试 .format 或 re.search 和条件

标签: python regex search


【解决方案1】:

您似乎想使用匹配整个字符串的模式。请注意,当您想要查找部分匹配项时,需要\b 字边界。当你需要一个完整的字符串匹配时,你需要anchors。由于re.match 将匹配锚定在字符串的开头,因此您只需要在模式结尾处$(字符串位置的结尾):

regex = '{}$'.format(re.escape(user_input))

然后使用

re.match(regex, search_string, re.IGNORCASE)

【讨论】:

    【解决方案2】:

    你可以这样尝试 re.finditer:

    >>> import re
    >>> user_input = "var"
    >>> text = "var variable var variable"
    >>> regex = r"(?=\b%s\b)" % re.escape(user_input)
    >>> [m.start() for m in re.finditer(regex, text)]
    [0, 13]
    

    它会迭代地找到所有匹配项。

    【讨论】:

    • 循环中的输出保存在哪里?因为我想打破第一个发现并说如果找到了,就做这个,否则就做那个。
    • @E.Oregel 然后将其放入循环中,如下所示:for m in re.finditer(regex, text): 并将您想要的放入循环中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2020-01-11
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多