【问题标题】:Is it possible to use re.search's result in re.sub as a variable?是否可以在 re.sub 中使用 re.search 的结果作为变量?
【发布时间】:2018-09-05 10:17:54
【问题描述】:

原始文本:

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

text1:

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

文本2:

(1-NP (2-DT>1 3-a) (4-JJ>1 5-small) (6-NN>1 7-miracle))**

我想把 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?

【问题讨论】:

  • 尝试删除 r'\1' 中的 r
  • 你的正则表达式只有一个匹配。这将是 q.group(0)。
  • 哇..你是对的。谢谢。

标签: python regex python-2.7


【解决方案1】:

使用 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

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

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
【解决方案2】:
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))'

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值
猜你喜欢
  • 2017-09-24
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多