提取磅符号之间的数据

2024-06-25 06:38:19 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我是通过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_NAMEjp_PoRcptDtl_Srcjp_EtlPrcsDt打印出来。你知道吗

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

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

这会导致以下错误:

nothing to repeat.

任何帮助或建议都将不胜感激!你知道吗


Tags: namefrom文本txtschemaasconnpo
3条回答

尝试转义()r'\(.*?\)'应该有用。你知道吗

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

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

您的正则表达式没有按预期工作,因为您同时使用*(0或更多)和?(0或1)来修改它之前的内容,但是a)它之前没有任何内容,b)您应该使用*?,而不是同时使用这两种内容。你知道吗

如果要捕获###anything#,则使用regex #(.*)#。你知道吗

相关问题 更多 >