Skip to main content
 首页 » 编程设计

python之提取井号之间的数据

2025年05月04日7over140

您好,我正在解析 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'] 
>>>  

引用,浏览Repeating Things in docs.python.org