作者jlhg (jlhg)
看板Python
标题Re: [问题] regex问题
时间Tue Nov 26 20:38:26 2013
试试
re.search('<[^<^>]*>', string)
可以定义为: 括号中间不要有括号的任何文字
re.search会从字串前面开始找,只要有符合条件就会output
和non-greedy没有关系
※ 引述《amigcamel (阿吉amig)》之铭言:
: 手边有一个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.28.171
1F:推 amigcamel:谢谢,原来我方向搞错了... 11/26 20:59