python3正则表达式匹配模式,但前提是它没有以某些字符结尾

时间:2019-07-01 21:06:36

标签: regex python-3.x

我有一个关于如何替换字符串模式的问题,但前提是它不能以感叹号结尾。

例如,“谢谢鲍勃”或“谢谢鲍勃”。应该替换为“谢谢,[NAME]”,但应替换为“谢谢,鲍勃!”不应更换。

到目前为止,我有这个:

regex = r"Thanks\,(\s)?(\n+)?[A-Z]?[a-z]+[^!]"
re.sub(regex, "Thanks, [NAME]", text)

这适用于您在“鲍勃”之后加上标点符号的情况,但不适用于“谢谢鲍勃”的情况

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用

(Thanks,\s*)[A-Z][a-z]+\b(?!!)

,并替换为\1[NAME]。参见regex demoregex graph

enter image description here

重点是,您需要在\b之后使用单词边界[a-z]+,并在之后添加negative lookahead (?!!) 。 >

详细信息

  • (Thanks,\s*)-第1组(替换模式中的\1):Thanks,和0+空格(\s*
  • [A-Z][a-z]+-大写字母,然后是1+小写字母
  • \b-单词边界,下一个字符不能为字母/数字/ _
  • (?!!)-当前位置右侧不允许!

Python demo

import re
rx = r"(Thanks,\s*)[A-Z][a-z]+\b(?!!)"
strs = ["Thanks, Bob", "Thanks, Bob.", "Thanks, Bob!"]
for s in strs: 
    print( re.sub(rx, r"\1[NAME]", s) )

输出:

Thanks, [NAME]
Thanks, [NAME].
Thanks, Bob!

答案 1 :(得分:0)

我的猜测是您的表达很好,我们将略作修改为:

INSERT INTO table_b (col1, col2, col3, col4, col5, col6)
SELECT col1, 'str_val', int_val, col4, col5, col6
FROM table_a

Demo

测试

^Thanks\s*,\s*([A-Z]?[a-z]*)\s*[^!]?$