可以在re.sub中使用re.search的结果作为变量吗?

时间:2018-09-05 10:17:55

标签: python regex python-2.7

原始文本:

  

(NP(DT a)(JJ小)(NN奇迹))

文本1:

  

(1-NP(2-DT 3-a)(4-JJ 5-小)(6-NN 7奇迹))**

文本2:

  

(1-NP(2-DT> 1 3-a)(4-JJ> 1 5-小)(6-NN> 1 7奇迹))**

我想将text1转换为text2。这样做的目的是使用> 1 表示数字2,4,而6的父代是数字1。

我想到了:

line = '(1-NP (2-DT 3-a) (4-JJ 5-small) (6-NN 7-miracle))'
q = re.search(r'^\(([0-9]{1,2})\-NP',line)               # capture the parent number 
i = re.sub(r'( \([^ ]+\b )',r'\1' + q.group(1) ,line)    # using the captured number in re.sub
print(str(i))

运行代码后,我收到错误消息:

raise error, "invalid group reference"
sre_constants.error: invalid group reference

问题出在哪里:

 r'\1' + q.group(1)

所以。如何使用python将text1转换为text2?

2 个答案:

答案 0 :(得分:1)

在Python中,无法使用sub()\1等函数来使用\2,扩展替换字符串中的括号组,...(如sed,awk或vi )。

相反,\g<1>\g<2>可以在替换字符串中引用组,...

import re

line = '(1-NP (2-DT 3-a) (4-JJ 5-small) (6-NN 7-miracle))'
q = re.search(r'^\(([0-9]{1,2})\-NP',line)
result = re.sub(r' \(([^ ]+?) ([^ ]+?)\)', ' (\g<1>>' + q.group(1) + ' \g<2>)', line)

print result

请注意,第二个正则表达式使用[^ ]+?而不是[^ ]+。问号使+成为所谓的“非贪婪”,这意味着它将匹配字符串的一部分,该字符串应尽可能小而不是尽可能大。后者(尽可能大,贪心)是默认的正则表达式行为。

答案 1 :(得分:0)

line = '(2-NP (3-DT 4-Every) (5-NN 6-fossil))'

for i in list(re.finditer(r'\(([0-9]){0,4}\-[A-Z]{2}',line))[1:]:
    line = re.sub(re.sub('\(','\(',i.group(0)),i.group(0)+'>1',line)
print(line)

输出

'(2-NP (3-DT>1 4-Every) (5-NN>1 6-fossil))'