繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM