您好我正在解析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_NAME
,ps_RDW_Conn.jp_RDW_SCHEMA_NAME
jp_PoRcptDtl_Src
和jp_EtlPrcsDt
。
我到目前为止的一些代码是
for eachLine in testFile:
print re.findall('#(*?)#', eachLine)
这给了我以下错误:
nothing to repeat.
非常感谢任何帮助或建议!
答案 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']
>>>
答案 1 :(得分:0)
你的正则表达式没有按预期工作,因为你使用*
(0或更多)和?
(0或1)来修改它之前的东西,但是a)之前没有任何东西它,和b)你应该使用*
或?
,而不是两者。
如果您要捕获##
或#anything#
,请使用正则表达式#(.*)#
。
答案 2 :(得分:-1)
尝试逃避(
和)
。 r'\(.*?\)'
应该有用。
for eachLine in testFile:
print re.findall(r'\(.*?\)', eachLine)