【问题标题】:Using regex to extract string position Python使用正则表达式提取字符串位置Python
【发布时间】:2014-05-13 15:14:19
【问题描述】:

我正在尝试使用正则表达式提取子字符串的位置(索引)。我需要使用正则表达式,因为字符串不会完全相同。我想获取子字符串的位置(开始或结束位置),所以我可以获取该子字符串后面的 1,000 个字符。

例如,如果我有“虽然经常交易外币,但大多数人赚的钱很少”。我想找到“外币”的位置,这样我就可以得到所有的单词。

f5 是文本。

我试过了:

p = re.compile("((^\s*|\.\s*)foreign\s*(currency|currencies))?")
for m in p.finditer(f5):
    print m.start(), m.group()

获取位置。这给了我(0,0),即使我已经检查以确保正则表达式能找到我在文本中寻找的内容。

我也试过了:

location = re.search(r"((^\s*|\.\s*)foreign\s*(currency|currencies))?", f5)
print location

输出是 <_sre.sre_match at>

如果我尝试

location.span() 

我又得到 (0,0)。

基本上,我想将 <_sre.sre_match at> 转换为给出搜索词位置的整数。

我花了半天时间寻找解决方案。感谢您的帮助。

【问题讨论】:

  • 你能给出一个f5short, copyable example 哪个不应该用吗?
  • SRE_Match 是 Python 中的匹配对象,因此您根本不需要转换它。例如,您需要通过group() 从对象中提取匹配项。

标签: python regex string substring


【解决方案1】:

除了以前的解决方案/cmets,如果你想要后面的所有单词,你可以这样做:

>>> location = re.search(r".*foreign\s*currenc(y|ies)(.*)", f5)
>>> location.group(2)
' are traded frequently, very little money is made by most.'

.group(2) 部分与正则表达式中的 (.*) 匹配。

【讨论】:

  • 使用非捕获组 (?:y|ies)(.*) 将在组 1 中捕获(逻辑性/可读性稍强一些)。
【解决方案2】:

您的模式包括“外国”一词之前的所有内容。所以python会考虑你匹配的那部分。如果您想丢弃它,只需将其从搜索字符串中删除即可。

试试:

 p = re.compile('foreign\s+(currency|currencies)?')
 m = p.search(s)
 m.start()

这也适用于finditer:

 for m in p.finditer(s):
     m.start()

【讨论】:

    【解决方案3】:

    没有太多的Python经验,所以我不能直接回答你的问题。但是,如果您想要以匹配开头的子字符串,为什么不匹配字符串的其余部分或删除匹配前的所有内容。

    Example 1:

    匹配foreign currenc(y|ies),后跟字符串中的所有其他字符。我使用了s 修饰符,以便点也匹配新行。

    foreign\s+currenc(?:y|ies).*
    

    Example 2:

    用一个空字符串替换这个表达式。这将延迟匹配所有内容,直到匹配 foreign currenc(y|ies) 的前瞻。

    .*?(?=foreign\s+currenc(?:y|ies))
    

    注意:我把(currency|currencies)改成了currenc(?:y|ies),因为它是slightly more efficient

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多