作者amigcamel (阿吉amig)
看板Python
标题[问题] regex问题
时间Tue Nov 26 20:08:26 2013
手边有一个regex的问题
不知道是不是跟处理中文有关
pat_en = "<foo<bar/pos>"
pat_ch = u"<夫<爸/pos>"
以上两个对等的例子,一为中文,一为英文
我的目标是要抓出最里面的那个括号就好
亦即
<bar/pos>
<爸/pos>
# 英文的部份没有什麽问题,如下
In [1]: re.search(r"<\w*/\w*>", pat_en).group()
Out[1]: '<bar/pos>'
# 中文...
In [2]: re.search(r"<.*?/\w*>", pat_ch).group()
Out[2]: '<夫<爸/pos>
这边的
?不是应该是non-greedy吗?
理论上不是应该要得到<爸/pos>吗?
如果有理解上的错误,烦请高人指点!
# 那我在左括号和右括号中间加一个否定式
In [3]: re.search(r"<.[^<]*?/\w*>", pat_ch).group()
Out[3]: '<爸/pos>'
可行
# 同样的方法也套用在英文上
In [4]: re.search(r"<.[^<]*?/\w*", pat_en).group()
Out[4]: '<bar/pos>'
也可行
不过我发现,这边的
?有加没加,好像差不多
所以修改如下
r"<.[^<]*
?/\w*>" --> r"<.[^<]*/\w*>"
# 套用修改後的的regex在英文上
In [5]: re.search(r"<.[^<]*/\w*>", pat_en).group()
Out[5]: '<bar/pos>'
# 套用修改後的regex在中文上
In [6]: re.search(r"<.[^<]*/\w*>", pat_ch).group()
Out[6]: '<爸/pos>'
由以上发现,这边
?根本没有作用
这看起来不像是中文编码问题
即便我在在flag加上re.UNICODE
也没有任何帮助
如下
In [7]: re.serach(r"<.*?/\w*>", pat_ch, re.UNICODE).group()
Out[7]: '<夫<爸/pos>'
请教大大们
怎样的regex才能比较精确的表达呢?
还有我哪边的理解错误了,请迷津指点一下
卡关卡好久了...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.4.198
※ 编辑: amigcamel 来自: 140.112.4.198 (11/26 20:09)
※ 编辑: amigcamel 来自: 140.112.4.198 (11/26 20:11)
1F:→ jokester:这个例子我会用 /<[^<>]>/来抓 11/26 20:34
2F:→ jokester:错了="= 想写/<[^<>]*>/ 的 11/26 20:34
3F:→ amigcamel:那请问一下,可以解释一下"?"那边出了什麽问题吗? 11/26 20:38
4F:→ jlhg:你大概误解了greedy的意思了,?是往右边限制,不是左边 11/26 20:44