示例:
- For 0123123123 , 1 应匹配,因为第二个 1 出现在任何其他数字重复之前。
- For 01234554321 , 5 应该匹配,因为第二个 5 出现在任何其他数字的重复之前。
我尝试过的一些正则表达式:
- 以下有效对于第一个例子,但不是第二个例子。它匹配 1 ,因为 1 是出现在随后重复的字符串中的第一个数字。
import re
m = re.search(r"(\d).*?\1", string)
print(m.group(1))
- 以下适用于第二个示例,但不适用于第一个示例。它匹配 3 - 特别是数字的第二次和第三次出现。我不知道为什么它会这样。
import re
m = re.search(r"(\d)(?!(\d).*?\2).*?\1", string)
print(m.group(1))
以下正则表达式将起作用:
import re
def find_first_duplicate_digit(string):
"""查找字符串中第一次重复的数字。
Args:
string: 要搜索的字符串。
Returns:
字符串中第一次重复的数字,如果字符串中没有重复的数字,则返回 None。
"""
match = re.search(r"(\d)(?!.*\1.*(\d)\2).*?\1", string)
if match:
return match.group(1)
else:
return None
strings = [
"0123123123",
"01234554321",
]
for string in strings:
first_duplicate = find_first_duplicate_digit(string)
print(f"字符串 '{string}' 中的第一个重复数字是: {first_duplicate}")
以下是正则表达式的分解方式:
-
(\d)
:这匹配任何数字并将其捕获到组 1 中。 -
(?!.*\1.*(\d)\2)
:这是一个负前瞻断言,它确保在匹配第一个捕获组中的相同数字之前,没有其他数字重复。-
.*
匹配任何字符(换行符除外),零次或多次。 -
\1
匹配第一个捕获组(在本例中为第一个数字)。 -
(\d)
匹配任何数字并将其捕获到组 2 中。 -
\2
匹配第二个捕获组(在本例中为第二个数字)。
-
-
.*?
:这匹配任何字符(换行符除外),零次或多次,非贪婪。 -
\1
:这匹配第一个捕获组(在本例中为第一个数字)。
本质上,此正则表达式首先查找任何数字。然后,它向前看以确保在同一个数字的另一个实例之前没有其他数字重复。如果是这种情况,它将匹配第一个数字的第二个实例。
此正则表达式适用于提供的两个示例字符串,以及其他一些测试用例。
标签:python,regex,regex-group,python-re,regex-negation From: 78810121