我有一个关于如何替换字符串模式的问题,但前提是它不能以感叹号结尾。
例如,“谢谢鲍勃”或“谢谢鲍勃”。应该替换为“谢谢,[NAME]”,但应替换为“谢谢,鲍勃!”不应更换。
到目前为止,我有这个:
regex = r"Thanks\,(\s)?(\n+)?[A-Z]?[a-z]+[^!]"
re.sub(regex, "Thanks, [NAME]", text)
这适用于您在“鲍勃”之后加上标点符号的情况,但不适用于“谢谢鲍勃”的情况
有什么想法吗?
答案 0 :(得分:1)
您可以使用
(Thanks,\s*)[A-Z][a-z]+\b(?!!)
,并替换为\1[NAME]
。参见regex demo和regex graph:
重点是,您需要在\b
之后使用单词边界[a-z]+
,并在之后添加negative lookahead (?!!)
。。 >
详细信息
(Thanks,\s*)
-第1组(替换模式中的\1
):Thanks,
和0+空格(\s*
)[A-Z][a-z]+
-大写字母,然后是1+小写字母\b
-单词边界,下一个字符不能为字母/数字/ _
(?!!)
-当前位置右侧不允许!
。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
^Thanks\s*,\s*([A-Z]?[a-z]*)\s*[^!]?$