包含且不包含某字符的正则表达式如何书写

这是要匹配的字符串:《公路圬工桥涵设计规范》《公路桥涵地基与基础设计规范》(JTG 3363-2019)

想要的结果是:《公路桥涵地基与基础设计规范》(JTG 3363-2019)

采用的正则表达式是:

.*?[^].*?\)

实际的结果却是:《公路圬工桥涵设计规范》《公路桥涵地基与基础设计规范》(JTG 3363-2019)

请问哪里出了问题?

最佳答案
import re

# 目标字符串
target_str = '《公路圬工桥涵设计规范》《公路桥涵地基与基础设计规范》(JTG 3363-2019)'

# 匹配正则表达式
regex = r'《[^《]*\)'
# regex = r'《.*?[^《].*?\)'
match = re.search(regex, target_str)

# 输出匹配结果
if match:
    print('匹配到的字符串为:', match.group())
else:
    print('没有匹配到相应字符串')

问题在于你没有搞清楚 .* 的含义,而且没有必要使用非贪婪匹配,因为你所需的结果是:以开头,)结尾,中间是非的任意字符,这时使用*就可以了。

BTW:以后请记得附上代码。

1年前 评论
forverd (楼主) 1年前
讨论数量: 9
import re

# 目标字符串
target_str = '《公路圬工桥涵设计规范》《公路桥涵地基与基础设计规范》(JTG 3363-2019)'

# 匹配正则表达式
regex = r'《[^《]*\)'
# regex = r'《.*?[^《].*?\)'
match = re.search(regex, target_str)

# 输出匹配结果
if match:
    print('匹配到的字符串为:', match.group())
else:
    print('没有匹配到相应字符串')

问题在于你没有搞清楚 .* 的含义,而且没有必要使用非贪婪匹配,因为你所需的结果是:以开头,)结尾,中间是非的任意字符,这时使用*就可以了。

BTW:以后请记得附上代码。

1年前 评论
forverd (楼主) 1年前

我有个疑问想请教一下,为什么书名号后跟非贪婪再跟)结尾,匹配不出来想要的结果呢? :neutral_face: :neutral_face:

import re

target_s = '《公路圬工桥涵设计规范》《公路桥涵地基与基础设计规范》(JTG 3363-2019)'
regex = '《.*?\)'

res = re.search(regex, target_s)
if res:
    print('res is', res.group())
else:
    print('None!!')
1年前 评论
hustnzj 1年前
Echo_AFang (作者) 1年前
hustnzj 1年前
Echo_AFang (作者) 1年前
Echo_AFang (作者) 1年前

仅供参考的另一种方式,使用正则表达式的后向搜索肯定模式

import re

s = "《公路圬工桥涵设计规范》《公路桥涵地基与基础设计规范》(JTG 3363-2019)"
pattern = r'(?<=》).*'

print(re.search(pattern, s).group())
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!