[英]Is it possible to use re.search's result in re.sub as a variable?
原始文字:
(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?
使用像sub()
这样的函数,在python中不能使用\\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
注意第二个正则表达式使用[^ ]+?
而不是[^ ]+
。 问号使+
成为所谓的“非贪婪”,这意味着它将匹配字符串的一部分,使其尽可能小,而不是尽可能大。 后者(尽可能大,贪心)是默认的正则表达式行为。
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))'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.