2010-11-10 56 views
0

如何删除<ref> *some text*</ref>以及ref本身的文本?用正则表达式替换某个词的某个部分

'...and so on<ref>Oxford University Press</ref>.'

re.sub(r'<ref>.+</ref>', '', string)

只有<ref>如果 <ref>后面是空白

编辑删除:它有不便做字边界我想......还是?

EDIT2我需要的是,它将数学最后(闭幕)</ref>哪怕是一个换行符。

回答

3

我并没有真正看到你的问题,因为粘贴的代码将删除字符串的<ref>...</ref>部分。但是,如果你的意思是,和空裁判标签不会被删除:。

re.sub(r'<ref>.+</ref>', '', '...and so on<ref></ref>.') 

然后,你需要做的是改变什么+与*

A +意味着一个或多个,而*手段零或更多。

http://docs.python.org/library/re.html

'.' (Dot.) In the default mode, this matches any character except a newline. 
    If the DOTALL flag has been specified, this matches any character including 
    a newline. 
'*' Causes the resulting RE to match 0 or more repetitions of the preceding 
    RE, as many repetitions as are possible. ab* will match ‘a’, ‘ab’, or ‘a’ 
    followed by any number of ‘b’s. 
'+' Causes the resulting RE to match 1 or more repetitions of the preceding 
    RE. ab+ will match ‘a’ followed by any non-zero number of ‘b’s; it will 
    not match just ‘a’. 
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE. 
    ab? will match either ‘a’ or ‘ab’. 
+0

以及如果关闭''在新行?我该如何处理? – Gusto 2010-11-10 22:12:33

+0

显然有一个标志(re.DOTALL),它使''。匹配所有字符_including_换行符。但是这似乎不适用于python2.6中的重新模块。 *更新:*看看docs.python.org/library/re.html它说re.sub:在版本2.7,3.1更改:添加了可选的标志参数。 – 2010-11-10 22:23:50

+0

我已经试过了(re.DOTALL)'应用re.sub(R“(S) *?”'但它失去控制和消除过多,超过了文字的一半 - 这是绝对错误的任何其他的想法从http://docs.python.org/library/re.html – Gusto 2010-11-10 22:34:22

1

你可能要保持谨慎,不要删除了一大堆的文字,只是因为有一个以上的收盘</ref>秒。下面的正则表达式是在我看来,更准确:

r'<ref>[^<]*</ref>' 

这将阻止“贪婪”匹配。

顺便说一句:有一个伟大的工具称为正则表达式教练来分析和测试你的正则表达式。你可以在:http://www.weitz.de/regex-coach/

编辑:忘了在第一段添加代码标签。

1

你可以做一个花哨的正则表达式来完成你想要的东西,但是你需要使用DOTALL和非贪婪的搜索,并且你需要了解正则表达式在一般情况下的工作方式,而你不需要。

你最好的选择是使用字符串方法而不是正则表达式,这是更Python反正:

while '<reg>' in string: 
    begin, end = string.split('<reg>', 1) 
    trash, end = end.split('</reg>', 1) 
    string = begin + end 

如果你想成为非常通用的,允许在标签的标签或空格和属性的怪资本,你也不应该这样做,但要投资学习一个html/xml解析库。 lxml目前似乎被广泛推荐并得到很好的支持。

0

如果您尝试使用正则表达式执行此操作,则代码为world of trouble。您正在有效地尝试解析某些内容,但解析器无法完成任务。

整个字符串匹配贪婪地吃可能太多,因为在这个例子中:

<ref>SDD</ref>...<ref>XX</ref> 

你最终cleraning了整个中东。

你真的想要一个解析器,就像Beautiful Soup

from BeautifulSoup import BeautifulSoup, Tag 
s = "<a>sfsdf</a> <ref>XX</ref> || <ref>YY</ref>" 
soup = BeautifulSoup(s) 
x = soup.findAll("ref") 
for z in x: 
    soup.ref.replaceWith('!') 
soup # <a>sfsdf</a> ! || ! 
+0

我知道站起来会更实际一些来自正则表达式清理HTML,但仍然...为了演习的缘故,我必须使用它。 – Gusto 2010-11-10 22:59:53

+0

虽然这几乎总是正确的方式去特别是如果你刮,根据我的经验,它为小型查找和替换脚本引入了不必要的复杂性。如果仔细测试,我上面描述的正则表达式方法可以快速解决大部分问题。 – erkmene 2010-11-10 23:00:17

相关问题