【问题标题】:Finding exact match for a string in a sentence查找句子中字符串的完全匹配
【发布时间】:2019-09-11 18:05:52
【问题描述】:

我正在尝试使用正则表达式根据完全匹配来定位句子中的单词。例如:

Sentence1 = 'keyword1 is my keyword, keyworda , keyword- and keyword+'
Sentence2 = 'This is my keyword2 , keywordakeyword2andkeyword+'
Sentence3 = 'This is my keywordakeywordandkeyword2'

另一个标准是检查keyword 在行首和中间是否出现。

句子/行正则表达式的开头

regex 1 = re.compile(r"^keyword1\b",re.MULTILINE | re.IGNORECASE)

这是正则表达式的中间:

regex2 = re.compile(r"(?!^)keyword2\b",re.MULTILINE | re.IGNORECASE)

regex1 应该在句子 1 中返回关键字 1 和位置

regex2 应该返回关键字 2(2 次出现)和句子 2 中的位置。注意关键字 2 在句子 2 中的第二次出现嵌入在其他字符串之间

regex2 应该从出现在行尾的句子 2 中返回关键字 2

我可能可以使用字符串比较,但我还需要获取keyword 的位置......因此尝试使用正则表达式。

【问题讨论】:

  • 为什么不str.index("keyword")
  • 抱歉,匆忙编辑中出现了一些错误.....已解决问题
  • 好的,所以如果你想匹配字符串keywordakeyword2andkeyword中的keyword2,那么它不是完全匹配,它只是一个子字符串。
  • 不是真的...当关键字不是行或句子中的第一个单词并且是句子中的第一个单词时,我需要在句子中的任何位置搜索关键字的出现
  • 正确的 regex2.findall(sentence2) 应该从句子 2 中返回两个关键字 2,但是 regex2.findall(sentence1) 不应该返回任何值,因为关键字 2 在句子 1 中不存在

标签: python regex


【解决方案1】:

正则表达式 1

您可以将此正则表达式与环视一起使用:

(?<!\S)keyword1(?!\S)

RegEx Demo 1

正则表达式详细信息:

  • (?&lt;!\S): 断言我们之前的位置没有非空白字符
  • keyword:匹配keyword1
  • (?!\S): 断言我们前面没有非空白字符

正则表达式 2

(?!^)keyword2

RegEx Demo 2

正则表达式详细信息:

  • (?!^): 断言我们不在行首
  • keyword2:匹配keyword2

对于编码,我建议在返回的python 中使用re.search 函数,然后使用start()end() 函数来获取匹配的位置。

【讨论】:

  • 这很接近..但没有考虑关键字出现的位置..即我需要检查 2 种情况,其中关键字出现在句子和/或行的开头并且关键字位于行的中间。
  • 对不起,我不明白。您想在行首和行尾跳过匹配的keyword 吗?您可以编辑问题并举例说明吗?
【解决方案2】:

你可以使用正则表达式

'keyword[\d]'

编译正则表达式

regobj = re.compile('keyword[\d]')

要在句子的开头找到匹配项,请使用编译对象上调用的 ma​​tch 函数。只有在开头找到匹配项时才会返回匹配的对象。

match = regobj.match(sentence1)

在编译后的对象上使用 finditer 函数在句子中查找匹配项

it = regobj.finditer(sentence2)
match = it.__next__()
match.start()

start() 函数返回匹配的起始索引,对于句子中的另一个匹配,在迭代器对象上调用 next() 函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多