【问题标题】:String Matching with wildcard in PythonPython中使用通配符进行字符串匹配
【发布时间】:2019-09-14 14:07:14
【问题描述】:

我正在尝试在包含通配符的字符串中查找子字符串的位置。例如:

substring = 'ABCDEF'
large_string = 'QQQQQABC.EFQQQQQ'

start = string.find(substring, large_string)
print(start)

5

提前谢谢你

【问题讨论】:

标签: python regex string


【解决方案1】:

我们的想法是将您要查找的内容(在本例中为 ABCDEF)转换为以下正则表达式:

([A]|\.)([B]|\.)([C]|\.)([D]|\.)([E]|\.)([F]|\.)

每个字符都放在[] 中,以防它是一个正则表达式特殊字符。唯一的复杂情况是搜索字符之一是否为^,如ABCDEF^^ 字符应该只是被转义,因此需要特殊处理。

然后您使用re.search 在字符串中搜索该模式:

重新导入

substring = 'ABCDEF'
large_string = 'QQQQQABC.EF^QQQQQ'

new_substring = re.sub(r'([^^])', r'([\1]|\\.)', substring)
new_substring = re.sub(r'\^', r'(\\^|\\.)', new_substring)
print(new_substring)
regex = re.compile(new_substring)
m = regex.search(large_string)
if (m):
    print(m.span())

打印:

([A]|\.)([B]|\.)([C]|\.)([D]|\.)([E]|\.)([F]|\.)
(5, 11)

【讨论】:

    【解决方案2】:

    不确定是否有正则表达式操作,但您可以生成一个可用的正则表达式模式列表。

    substring = "ABCDE"
    patterns = []
    for i in range(len(substring)):
        patterns.append(string[:i]+'.?' + string[i:])
    

    这会在我们的示例中为您提供以下输出:

    .?abcde
    a.?bcde
    ab.?cde
    abc.?de
    abcd.?e
    

    有了这个列表,您现在可以找到索引

    for pattern in patterns:
       try:
          print("Index is" + re.search(pattern,substring).start())
          break
       excpect AttributeError:
          pass
    else:
       print("Not found")
    ```python
    
    

    【讨论】:

      【解决方案3】:

      我的尝试:

      from itertools import combinations
      
      def gen_wild_cards(string):
          list_ = []
          start_indexes = [i for i in range(len(string))]
          for i in range(1, len(string)):
              combs = [v for v in combinations(start_indexes, i)]
              for c in combs:
                  new_string = list(string)
                  for index in c:
                      new_string[index] = "."
                  list_.append("".join(new_string))
          return list_
      
      large_string = 'QQQQQABC.EFQQQQQ'
      basic_string = "ABCDEF"
      list_ = gen_wild_cards(basic_string)
      for wildcard in list_:
          print(large_string.find(wildcard))
      

      基本上我正在生成所有通配符并通过大字符串搜索所有通配符。生成的通配符:

      .BCDEF
      A.CDEF
      AB.DEF
      ABC.EF
      ABCD.F
      ABCDE.
      ..CDEF
      .B.DEF
      .BC.EF
      .BCD.F
      .BCDE.
      A..DEF
      A.C.EF
      A.CD.F
      A.CDE.
      AB..EF
      AB.D.F
      AB.DE.
      ABC..F
      ABC.E.
      ABCD..
      ...DEF
      ..C.EF
      ..CD.F
      ..CDE.
      .B..EF
      .B.D.F
      .B.DE.
      .BC..F
      .BC.E.
      .BCD..
      A...EF
      A..D.F
      A..DE.
      A.C..F
      A.C.E.
      A.CD..
      AB...F
      AB..E.
      AB.D..
      ABC...
      ....EF
      ...D.F
      ...DE.
      ..C..F
      ..C.E.
      ..CD..
      .B...F
      .B..E.
      .B.D..
      .BC...
      A....F
      A...E.
      A..D..
      A.C...
      AB....
      .....F
      ....E.
      ...D..
      ..C...
      .B....
      A.....
      

      如果您只对第一场比赛感兴趣,您可以使用带有生成器的惰性方法,而不是一次性生成所有通配符

      【讨论】:

        【解决方案4】:

        您可以从re 使用index().start()

        index = large_string.index(substring)
        print(index)
        
        index = re.search(substring, large_string).start()
        print(index)
        

        【讨论】:

          猜你喜欢
          • 2015-07-29
          • 1970-01-01
          • 1970-01-01
          • 2011-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多