您好,我正在解析 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.
非常感谢任何帮助或建议!
最佳答案
与 bash
正则表达式不同,*
不是通配符,而是表示 repeat 0 or more times the thing before me.
在您的正则表达式中,您的 *
没有要修改的符号,因此您看到了提示 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']
>>>
关于python - 提取井号之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24272463/