原始文本:
(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?
答案 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))'