簡體   English   中英

在Python中使用通配符進行字符串匹配

[英]String Matching with wildcard in Python

我試圖在包含通配符的字符串中找到子字符串的位置。 例如:

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

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

5

先感謝您

這個想法是將您要尋找的內容(在這種情況下為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)

不知道是否為此進行了正則表達式操作,但是您可以生成將起作用的正則表達式模式列表。

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

我的嘗試:

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

如果您只對第一個比賽感興趣,則可以使用帶有生成器的惰性方法,而不用一次生成所有通配符

您可以從重新使用index().start()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM