有没有办法使用正则表达式查找两个字符串之间的子字符串?

时间:2019-09-17 15:55:43

标签: python regex

我知道似乎已经有人问过这个问题,但是我已经尝试过搜索并使用其他答案作为示例,但由于某种原因,我似乎无法使其正常工作。

我有文字:

    ['root(ROOT-0, love-2) s1', 'amod(perve-5, good-4) s2',
    'advmod(love-2, thanks-12) s3', 'amod(mags-16, glossy-15) s4']

我只希望amod(至-之间的文本。 例如,我想要:

'perve' and 'mags'

我尝试过:

words = re.findall('\((.*?)\-', v)

但它返回:

['ROOT', 'perve', 'love', 'mags']

任何建议将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以使用:

>>> test_str = ("    ['root(ROOT-0, love-2) s1', 'amod(perve-5, good-4) s2',\n"
...     "    'advmod(love-2, thanks-12) s3', 'amod(mags-16, glossy-15) s4']")
>>>
>>> print ( re.findall(r"amod\(([^-]*)-", test_str) )
['perve', 'mags']

RegEx Demo

RegEx详细信息:

  • amod:匹配文字amid(
  • ([^-]*):匹配0个或多个非-的字符并将其捕获在#1组中
  • -:匹配文字-

答案 1 :(得分:0)

这似乎可以做为正则表达式:

(?<=amod\().+?(?=-)

Regex demo

答案 2 :(得分:0)

当我想在两个已知子字符串之间找到一个任意子字符串时,我通常依靠先行声明和后向声明的组合。

for string in List:
    match = re.search(r'(?<=amod\()[^-]+(?=-)',string).group()
    print(match)

请注意,由于后置断言[^-],因此必须使用(?=-)(除负号外的所有字符)。您不能使用贪婪的.+,然后期望正则表达式停止在您的后视匹配,如果您的后视(-)也处于贪婪匹配(。+)

希望这就是您想要的。