【问题标题】:Python - Locating the position of a regex match in a string?Python - 在字符串中定位正则表达式匹配的位置?
【发布时间】:2011-02-10 02:10:02
【问题描述】:

我目前正在使用正则表达式搜索 RSS 提要,以查找是否提到了某些单词和短语,然后还想提取匹配两边的文本。例如:

String = "This is an example sentence, it is for demonstration only"
re.search("is", String)

我想知道找到“is”匹配项的位置,以便我可以提取和输出如下内容:

1 match found: "This is an example sentence"

我知道拆分很容易,但我需要知道匹配的第一个字符在字符串中的索引是什么,我不知道如何找到

【问题讨论】:

  • 您实际上会在示例中找到两次“is”。

标签: python regex


【解决方案1】:

你可以使用.find("is"),它会返回字符串中“is”的位置

或使用 .start() from re

>>> re.search("is", String).start()
2

其实它的匹配“is”来自“This

如果需要逐字匹配,请在“is”前后使用\b\b是单词边界。

>>> re.search(r"\bis\b", String).start()
5
>>>

有关 python 正则表达式的更多信息,docs 此处

【讨论】:

  • 不知道我是如何在文档中遗漏了这一点的,这正是我需要的,谢谢!
  • 如果你只想获取单词“is”,我认为re.search(" is ", String).start() 也应该使用单词......当然还有其他例子。
  • 请注意,如果没有匹配项,re.search 会返回 None。
  • 如何搜索列表而不是单个单词?喜欢 [0-9]?
【解决方案2】:

我认为这个问题还没有完全回答,因为所有答案都只给出了单个匹配示例。 OP 的问题展示了具有 2 个匹配项以及一个不应报告的子字符串匹配项的细微差别,因为它不是单词/标记。

要匹配多个匹配项,可以执行以下操作:

iter = re.finditer(r"\bis\b", String)
indices = [m.start(0) for m in iter]

这将返回原始字符串的两个索引的列表。

【讨论】:

  • 是的,谢谢。我在找这个。 OP 要求提供职位,但接受的答案仅返回 1 个职位。
【解决方案3】:

re.Match objects have a number of methods 为您提供帮助:

>>> m = re.search("is", String)
>>> m.span()
(2, 4)
>>> m.start()
2
>>> m.end()
4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 2021-12-16
    • 2021-04-27
    • 2013-04-16
    • 1970-01-01
    • 2022-08-03
    • 2015-04-01
    • 2020-11-29
    相关资源
    最近更新 更多