【问题标题】:Use python regex to catch similar strings使用 python 正则表达式捕获相似的字符串
【发布时间】:2019-07-30 09:53:53
【问题描述】:

我有 2 个表单字符串:

Beta_Gambus_teta_some_changeable_string_2017.02.1276 and 
Beta_Gambus_teta__some_changeable_string_update_2017.02.1276

例子:

 Beta_Gambus_teta_wqtr_2017.02.1276.ctr
 Beta_Gambus_teta_wqtr_update_2017.02.1277.ctr
 Beta_Gambus_teta_tpsedr_2017.02.1276.ctr
 Beta_Gambus_teta_tpesdr_update_2017.02.1277.ctr
 Beta_Gambus_teta_cnmsr_2018.02.1279.ctr 
 Beta_Gambus_teta_cnms_update_2018.02.1279.ctr

我需要用正则表达式来捕捉其中带有“更新”的那些与那些没有“更新”的分开。

我使用的是^.+_(.+)\.ctr$,但它太宽泛了。

【问题讨论】:

  • 所有字符串都以Beta_Gambus_teta 开头吗?
  • 为什么不"update" in s
  • @TimBiegeleisen 是的

标签: python regex python-2.7


【解决方案1】:

除非你没有告诉我们什么,否则这里根本不需要正则表达式...

strings = ["Beta_Gambus_teta_wqtr_2017.02.1276.ctr",
           "Beta_Gambus_teta_wqtr_update_2017.02.1277.ctr",
           "Beta_Gambus_teta_tpsedr_2017.02.1276.ctr",
           "Beta_Gambus_teta_tpesdr_update_2017.02.1277.ctr",
           "Beta_Gambus_teta_cnmsr_2018.02.1279.ctr",
           "Beta_Gambus_teta_cnms_update_2018.02.1279.ctr"]

with_update = []
no_update = []
for s in strings:
    if "update" in s:
        with_update.append(s)
    else:
        no_update.append(s)

甚至摆脱if

res = ([], [])

for s in strings:
    res["update" in s].append(s)

no_update, with_update = res

两者都给出:

>>> print(with_update)
['Beta_Gambus_teta_wqtr_update_2017.02.1277.ctr', 'Beta_Gambus_teta_tpesdr_update_2017.02.1277.ctr', 'Beta_Gambus_teta_cnms_update_2018.02.1279.ctr']
>>> print(no_update)
['Beta_Gambus_teta_wqtr_2017.02.1276.ctr', 'Beta_Gambus_teta_tpsedr_2017.02.1276.ctr', 'Beta_Gambus_teta_cnmsr_2018.02.1279.ctr']

【讨论】:

    【解决方案2】:

    您可以尝试使用以下模式进行更新匹配:

    Beta_Gambus_teta_[^_]+_update_\d{4}\.\d{2}\.\d{4}\.ctr
    

    并将此模式用于非更新匹配:

    Beta_Gambus_teta_[^_]+_\d{4}\.\d{2}\.\d{4}\.ctr
    

    示例脚本:

    path = "Beta_Gambus_teta_wqtr_update_2017.02.1277.ctr"
    if re.search(r'Beta_Gambus_teta_[^_]+_update_\d{4}\.\d{2}\.\d{4}\.ctr', path):
        print("MATCH")
    

    【讨论】:

      【解决方案3】:

      要使用_update_ 匹配字符串,请使用:

      ^Beta_Gambus_teta_.*_update_\d{4}\.\d{2}\.\d{4}\.ctr$
      

      并匹配没有_update_的字符串:

      ^Beta_Gambus_teta_(?!.*_update_).*_\d{4}\.\d{2}\.\d{4}\.ctr$
      

      这里的(?!.*_update_) 是一个否定的先行断言,如果在启动Beta_Gambus_teta_ 部分之后找到_update_,则匹配失败。

      【讨论】:

      • 这两种路径之间的关系似乎只是将update_从正例中去掉。
      • 由于 OP 使用术语 some_changeable_string 我认为它可以是任何可能包含或不包含 _
      【解决方案4】:

      您是否尝试过以下方法?

      .+update.+
      

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        • 2014-08-27
        • 2016-12-15
        相关资源
        最近更新 更多