2012-05-17 54 views
2

我有这个Perl正则表达式,我想将它转换为Python。Perl正则表达式的Python版本

我想要的正则表达式是一个搜索和替换,找到文本并将其转换为大写。它也必须是第一个发生的结果。 Perl的正则表达式:

open FILE, "C:/thefile.txt"; 
while (<FILE>){ 
    # Converts "foo yadayada bar yadayada" 
    #  to "FOO bar yadayada" 
    s/(^.*?)(yadayada)/\U$1/; 
    print; 
} 

Python的正则表达式我已经无法正常工作:

import re 
lines = open('C:\thefile.txt','r').readlines() 
for line in lines: 
    line = re.sub(r"(yadayada)","\U\g<1>", line, 1) 
    print line 

我意识到\U\g<1>是什么是不工作,因为Python不支持\U大写..所以我该用什么!?!

+0

记录的Perl代码所做的Python程序员谁不使用Perl足够熟悉。 – ikegami

+0

你确定这不是's /(yadayada)/ \ U $ 1 /'吗? ' – ikegami

回答

3

re.sub可以接受一个函数,它处理每个匹配对象并返回一个字符串。所以,你可以做这样的:

In [4]: def uppergrp(match): 
    ...:  return match.group(1).upper() 
    ...: 

In [5]: re.sub("(yada)", uppergrp, "abcyadadef", count=1) 
Out[5]: 'abcYADAdef' 

使用Python正则表达式的工作是不太方便,但Python程序员往往不太热衷于使用正则表达式比Perl程序员。

+0

完美的工作,但我很困惑,你将如何使用它与多个替代品。我如何在re.sub中包含多个函数?我如何将单词连接到大写单词的末尾? – user1399782

+0

@ user1399782你想为每个替换做一系列的事情吗?您可以根据需要使功能尽可能地复杂。你想做不同部分的不同替代品吗?您可以多次调用're.sub',或者构建更复杂的正则表达式并检查函数内部的匹配。 要在大写单词后添加一些内容,您可以将函数'return match.group(1).upper()+'something''。 –

+0

对于该输入,Perl代码输出“ABCdef”,而不是“abcYADAdef”。 – ikegami

2

sub的第二个参数也可以是一个函数,这意味着如果Python中的正则表达式语言无法完成你想要的东西(或者至少使它非常困难),你可以定义自己的函数来代替它。

例如。

re.sub(pattern, lambda x: x.group(1).upper(), string) 

编辑:这个函数会得到一个MatchObject

+0

我们在几秒钟内打出基本相同的答案。赢得'一个显而易见的方式'。 ;-) –

+0

确实,虽然你似乎刚刚打败了我。 – Dunes