Python中使用通配符进行字符串匹配

6
我正在尝试查找包含通配符的字符串中子字符串的位置。例如:
substring = 'ABCDEF'
large_string = 'QQQQQABC.EFQQQQQ'

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

5

感谢您提前阅读。

4个回答

2

这个想法是将你寻找的内容,例如ABCDEF,转化为以下正则表达式:

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

每个字符都被放置在[]中,以防它成为正则表达式特殊字符。唯一的复杂性在于如果搜索字符之一是^,例如ABCDEF^,那么^字符应该被转义并且需要特殊处理。

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

import re

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)

0
不确定是否有适用于此的正则表达式操作,但您可以生成一系列可行的正则表达式模式列表。
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


0

我的尝试:

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))

基本上我正在生成所有通配符,并通过large_string搜索它们。 生成的通配符:

.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.....

如果您只对第一个匹配感兴趣,可以使用惰性方法和生成器,而不是一次性生成所有通配符。

-1

你可以使用 index() 或者 .start() 来自 re

index = large_string.index(substring)
print(index)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接