正则表达式提取指定字符串

text = u'''$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,
$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,
$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,
$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,
$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,'''
#如何提取出$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$两端$包含的字符串,目标是提取出5组字符串
#用pattern = re.compile(r'\\frac{.*?}{(.*?)}', re.S)不能正确提取出想要的数据
阅读 7k
2 个回答

题主真是,问问题不一步问到位

答案如下:

#-*- coding: utf-8 -*-
import re

text = u'''$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,
$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,
$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,
$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,
$\frac{$\frac{1}{2}$}{$sqrt[]{2}$}$,'''

re_text = re.compile(ur'\$(.+)\$')
for i in re_text.finditer(text):
    #print(i.group(1))
    #本来到上面这行就可以结束了,然而上面的\f会被python转义,所以我们转回去
    print(i.group(1).replace("\f", "\\f"))

输出

\frac{$\frac{1}{2}$}{$sqrt[]{2}$}
\frac{$\frac{1}{2}$}{$sqrt[]{2}$}
\frac{$\frac{1}{2}$}{$sqrt[]{2}$}
\frac{$\frac{1}{2}$}{$sqrt[]{2}$}
\frac{$\frac{1}{2}$}{$sqrt[]{2}$}

这个看你具体业务了,如果按照你上面的text和原来的正则表达式的话,正则改成'\\frac{.*}'应该就能完成,如果是要捕捉两个$符号之间的 '\$(.*)\$'的子捕获应该就是结果.
你原来的表达式因为加了'?',变成非贪婪,第一个'{.*?}'捕捉的是{$\frac{1},第二个捕捉的是{2},所以没有提取正确数据

问题似乎换成多行的了,不过一样,看你的正则配置'.'是匹配非换行符的,则不变,如果'.'是匹配包括换行符的,那就换成'\${\S*}\$'

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题