【问题标题】:Extract data between pound signs提取英镑符号之间的数据
【发布时间】:2014-06-17 20:09:25
【问题描述】:

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

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.

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

【问题讨论】:

  • 尝试逃离()(例如r'\(.*?\)')。
  • 您的原始示例文本有一些换行符。现在一切都在一条线上?
  • 不,它们在实际文件中的不同行

标签: python regex


【解决方案1】:

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 在 cmets 中所建议的相似的效果,防止多个组被吸收到一个组中。

>>> 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 不知道为什么要投反对票...但是,我建议使用"#([^#]+)#,这样它就不会意外选择多个组。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    尝试逃离()r'\(.*?\)' 应该可以工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多