在英镑符号之间提取数据

时间:2014-06-17 20:09:25

标签: python regex

您好我正在解析XML文件,抓取SQL文本和参数。我需要拉出两个#符号之间的弦。例如,如果这是我的文字:

CASE WHEN TRIM (NVL (a.SPLR_RMRK, ' ')) = '' OR TRIM (NVL (a.SPLR_RMRK, ' ')) IS NULL THEN '~' ELSE a.SPLR_RMRK END AS TXT_DESCR_J, 'PO' AS TXT_TYP_CD_J FROM #ps_RDW_Conn.jp_RDW_SCHEMA_NAME#.P_PO_RCPT_DTL a, (SELECT PO_RCPT_DTL_KEY, ETL_CRT_DTM FROM #ps_RDW_Conn.jp_RDW_SCHEMA_NAME#.#jp_PoRcptDtl_Src# WHERE ETL_UPDT_DTM > TO_DATE ('#jp_EtlPrcsDt#', 'YYYY-MM-DD:HH24:MI:SS'))

我希望打印ps_RDW_Conn.jp_RDW_SCHEMA_NAMEps_RDW_Conn.jp_RDW_SCHEMA_NAME jp_PoRcptDtl_Srcjp_EtlPrcsDt

我到目前为止的一些代码是

for eachLine in testFile:
    print re.findall('#(*?)#', eachLine)

这给了我以下错误:

nothing to repeat.

非常感谢任何帮助或建议!

3 个答案:

答案 0 :(得分:0)

bash正则表达式不同,*不是外卡字符,而是说重复0次或更多次我之前的事情

在正则表达式中,*没有要修改的符号,因此您看到了投诉nothing to repeat

另一方面,如果您为.提供*符号进行修改,则以一行测试为例,

eachLine = '#ps_RDW_Conn.jp_RDW_SCHEMA_NAME#.P_PO_RCPT_DTL a, (SELECT PO_RCPT_DTL_KEY, '

re.findall('#(.*?)#', eachLine)

我们得到了,

['ps_RDW_Conn.jp_RDW_SCHEMA_NAME']

更多细节。 我不确定这是否符合您的意图,但您的*?实际上已经放好了。 *?被解释为单个限定词,表示重复0次或更多次我之前的事情,但要尽可能少

所以这最终会得到@tobias_k在评论中建议的类似效果,以防止多个群体被吸收到其中。

>>> line = 'And here is # some interesting code #, where later on there are #fruit flies# ?' 
>>> re.findall('#(.*)#', line)
[' some interesting code #, where later on there are #fruit flies']

>>> 
>>> re.findall('#(.*?)#', line)
[' some interesting code ', 'fruit flies']
>>> 

供参考,浏览Repeating Things in docs.python.org

答案 1 :(得分:0)

你的正则表达式没有按预期工作,因为你使用*(0或更多)和?(0或1)来修改它之前的东西,但是a)之前没有任何东西它,和b)你应该使用*?,而不是两者。

如果您要捕获###anything#,请使用正则表达式#(.*)#

答案 2 :(得分:-1)

尝试逃避()r'\(.*?\)'应该有用。

for eachLine in testFile: print re.findall(r'\(.*?\)', eachLine)