如何确保正则表达式中至少出现 A 和 B 符号之一?

How to ensure that at least one of A and B sign appears in the regex?

s_l = ["春天年初, ...","1999年", "很多年以前"]
for front_part in s_l:
    idx_year = re.search(r'[\d]*[年]{1}[初末底前]{0,1}',front_part).end() \
    if re.search(r'[\d]*[年]{1}[初末底前]{0,1}',front_part) else 0
    print(idx_year)

我要查找包含的子串的idx,同时前必须有数字(符号A) [初末底前](符号B)在“年”后面,例如s_l,应该return 4,5,0

一个划分正则表达式的想法,比如

re.search(r'[\d]+[年]{1}',front_part) or re.search(r'[年]{1}[初末底前]{0,1}',front_part)

但它太复杂了,另一个正在使用(?=...),但我还不知道如何使用它,有什么建议吗?

试试这个,

lst = ["春天年初, ...","1999年", "很多年以前"]
pattern = re.compile("(.*\d|初末底前)年.*")
for i, s in enumerate(lst):
  patterns = list(pattern.finditer(s))
  if patterns != []:
    print(list(map(lambda item:(i, item.span()), patterns)))

输出将类似于 [(1, (0, 5))]。这里这个列表的每个元素的第一部分将是列表 lst 中匹配条件的字符串的索引。第二部分是列表项中这些条件出现的索引。

您可以使用后向断言来匹配前面有数字的 。使用交替模式来匹配后跟 [初末底前]:

的模式
pattern = re.compile(r'(?<=\d)年|年[初末底前]')
print([match.end() if match else 0 for match in map(pattern.search, s_l)])

这输出:

[4, 5, 0]