【问题标题】:Python/Regex: Get all strings between any two characters [duplicate]Python / Regex:获取任意两个字符之间的所有字符串[重复]
【发布时间】:2018-02-16 03:14:35
【问题描述】:

我有一个用例需要识别任意两个字符之间的许多不同的文本。

例如,

  1. 单个空格和( 之间的字符串:def test() 将返回 test
  2. 单词和空格之间的字符串 (paste) 和特殊字符 (/):@paste "game_01/01" 将返回 "game_01
  3. 在单个空格和 ( 之间的字符串,带有多个目标字符串:} def test2() { Hello(x, 1) 将返回 test2Hello

为此,我正在尝试编写一些通用的东西来识别任意两个字符之间的最短字符串。

我目前的做法是(来自 chrisz):

pattern = '{0}(.*?){1}'.format(re.escape(separator_1), re.escape(separator_2))

对于第一个用例,separator_1 = \sseparator_2 = (。这显然不起作用,我错过了一些东西,但不确定是什么。

tl;dr如何编写通用正则表达式来解析任意两个字符之间的最短字符串?

  • 注意:我知道有很多这样的例子,但它们看起来很具体,如果可能的话,我正在寻找一个通用的解决方案。

【问题讨论】:

  • "This is not working" 究竟是什么意思?有错误信息吗?它不会产生您期望的输出吗?
  • 这不是免费的编码服务、免费的教程服务或免费的设计服务。
  • @Aran-Fey 它不会产生我希望的结果。例如,目标字符串之前会包含一个空格,有时是字符(例如`test) characters after the string will be included (e.g. test()`)
  • 你必须使用正则表达式吗?为什么不写一个简单的函数呢?
  • @FatihAkici 实际上我不必这样做,但我认为这会更简单、更通用并且也很想知道解决方案是什么

标签: python regex


【解决方案1】:

如果这是您要找的,请告诉我:

import re

def smallest_between_two(a, b, text):
    return min(re.findall(re.escape(a)+"(.*?)"+re.escape(b),text), key=len)

print(smallest_between_two(' ', '(', 'def test()'))
print(smallest_between_two('[', ']', '[this one][not this one]'))
print(smallest_between_two('paste ', '/', '@paste "game_01/01"'))

输出:

test
this one
"game_01

为它的作用添加解释:

re.findall():

返回字符串中所有不重叠的模式匹配,作为字符串列表

re.escape()

转义模式中除 ASCII 字母和数字之外的所有字符。如果您想匹配其中可能包含正则表达式元字符的任意文字字符串,这很有用

(.*?)

.*? 匹配任何字符(行终止符除外)

*? 量词——在零次和无限次之间匹配,尽可能少,根据需要扩展(惰性)

所以我们的正则表达式匹配两个任意转义字符串之间的任何字符(不包括行终止符),然后从re.findall() 返回的list 中返回最短长度的字符串。

【讨论】:

  • 当同一行上有多个表达式时,这似乎不起作用,但我相信我可以解决这个问题。似乎re.escape 是我想念的东西。感谢您的帮助。
  • 当同一行有多个表达式时,你是什么意思?
  • 例如,def test() hello() 只会得到test 而不是hello。可能是由于min 超过len
  • 您的问题是:两个字符之间的最短字符串。 Hello 不是' '( 之间的最短字符串。如果您删除 min,您将获得所有符合条件的字符串。
  • 如果您想要所有匹配项,请使用:return re.findall(re.escape(a)+"(.*?)"+re.escape(b),text)
猜你喜欢
  • 2015-06-24
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
相关资源
最近更新 更多