如何确保正则表达式中至少出现 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]
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]