【问题标题】:How to remove text after and before specific words in a string using python regex如何使用python regex删除字符串中特定单词前后的文本
【发布时间】:2015-08-27 15:48:46
【问题描述】:

我有一个字符串“从 'a.dat' 复制表 a (no = 1, name = xyz, city = c0nl);”。 在此我想删除“复制”和“来自”中的单词,但需要文件名: 我想要的输出是“从 a.dat 复制一个;”

任何帮助都会很棒。我想为此使用正则表达式。

【问题讨论】:

  • 对于“hi copy copybook fromasdf from a.dat”和“hi copybook is copy not from c.dat”你想要什么输出?
  • 还是不清楚。 'a' 总是文件名的一部分吗?你能有:“从 bar.dat 复制表 foo....”还是总是“从 foo.dat 复制表 foo...”?

标签: python regex


【解决方案1】:

您可以将正则表达式模块 re 和函数 sub(替换/替换)与前瞻 (?=from) 和后瞻 (?<=copy )(也称为 lookaround)结合使用,以便仅删除请求的部分 (.*) 介于两者之间:

import re
print re.sub(r'(?<=copy )(.*)(?=from)', '', "copy table values from 'a.dat';")

输出

copy from 'a.dat';

【讨论】:

  • 现在如果字符串是“从 'abc.dat'\g 复制表 abc”,我怎样才能删除 'table' 但可以从中保留表名。我的意思是如何实现输出“从 'abc.dat'\g 复制 abc”。我很困惑,因为所有复制语句中的表名都会不同。
  • @Basel,我试过了,但我编辑的内容被拒绝了。 :( 所以无法修改它。为了清楚起见,我会再次问以下问题:输入字符串是“从 a.dat\g 复制表 a (no = 10, name = "kavya")”,所需的输出是: "从 a.dat\g 复制一个"
【解决方案2】:

你可以这样做:

import re
mystr = "copy table values from 'a.dat';"
print(re.sub('copy.*from', 'copy from', mystr))

而且您不必担心空间、贪婪和所有这些问题。

【讨论】:

  • @Basel,我试过了,但我编辑的内容被拒绝了。 :( 所以无法修改它。为了清楚起见,我会再次问以下问题:输入字符串是“从 a.dat\g 复制表 a (no = 10, name = "kavya")”,所需的输出是: "从 a.dat\g 复制一个"
【解决方案3】:
(?<=\bcopy\b)[\s\S]*?(?=\s*\bfrom\b)

使用\blookarounds。查看演示。

https://regex101.com/r/sS2dM8/11

import re
p = re.compile(r'(?<=\bcopy\b)[\s\S]*?(?=\s*\bfrom\b)', re.MULTILINE)
test_str = "copy table values from 'a.dat';"
subst = ""

result = re.sub(p, subst, test_str)

输出:copy from 'a.dat';

【讨论】:

  • @Laawanya 上述解决方案的问题是asdcopy asd sad fromsds 将是asd sad。你想要这个吗?
猜你喜欢
  • 2013-09-06
  • 1970-01-01
  • 2021-05-22
  • 2021-12-06
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多