Python正则表达式替换反转搜索删除太多

2024-04-27 03:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python2.7中工作。我试图从字符串中删除所有内容,而不是数据库和表名组合。为此,我使用regex,无意中删除了所有的空白(我需要保留这些空白来分隔值)

s = "replace view dw1.tbl1_st as select dw2.tbl1_st.col1, dw2.tbl1_st.col2, "
s = s + "dw2.tbl1_st.col3,  dw2.tbl1_st.col4  dw2.tbl1_st.col5, "
s = s + "dw2.tbl1_st.col6, dw2.tbl1_st.col7  dw2.tbl1_st.col15, dw2.tbl1_st.col8, "
s = s + "dw2.tbl1_st.col9, dw2.tbl1_st.col10,  dw2.tbl1_st.col11, dw2.tbl1_st.col12, "
s = s + "dw2.tbl1_st.col13, dw2.tbl1_st.col14 from dw2.tbl1_st;"

replaced = re.sub(r'((?!\w+\.\w+).)', '', s)

结果集正在删除数据库和表名之间的“.”。但我想保留“.”和空格

>> replaced
'dw1dw2tbl1_stdw2tbl1_stdw2tbl1_stdw2tbl1_stdw2tbl1_stdw2tbl1_stdw2tbl1_
 stdw2tbl1_stdw2tbl1_stdw2tbl1_stdw2tbl1_stdw2tbl1_stdw2tbl1_
 stdw2tbl1_stdw2tbl1_stdw2'

>> desired_results (Option 1)
'dw1.dw2.tbl1_st dw2.tbl1_st, dw2.tbl1_st, dw2.tbl1_st, dw2.tbl1_st, 
dw2.tbl1_st, dw2.tbl1_st, dw2.tbl1_st, dw2.tbl1_st, dw2.tbl1_st, 
dw2.tbl1_st, dw2.tbl1_st, dw2.tbl1_st, dw2.tbl1_st, dw2.tbl1_st, dw2.'

或同样可行:

>> desired_results (Option 2)
'dw1 dw2tbl1_st dw2tbl1_st dw2tbl1_st dw2tbl1_st dw2tbl1_st 
dw2tbl1_st dw2tbl1_st dw2tbl1_st dw2tbl1_st dw2tbl1_st 
dw2tbl1_st dw2tbl1_st dw2tbl1_st dw2tbl1_st dw2tbl1_st dw2'

Tags: 字符串数据库内容results空白regexoptionst
1条回答
网友
1楼 · 发布于 2024-04-27 03:26:21

如果您知道字符串的结构并且它是相当规则的,那么有一种方法是不使用.来匹配所有内容,而是使用否定来匹配除空格或逗号以外的任何内容:

>>> replaced = re.sub(r'((?!\w+\.\w+)[^, ])', '', s)
>>> replaced
'  dw1   dw2tbl1_st, dw2tbl1_st, dw2tbl1_st,  dw2tbl1_st  dw2tbl1_st,
dw2tbl1_st, dw2tbl1_st  dw2tbl1_st, dw2tbl1_st, dw2tbl1_st, dw2tbl1_st,
dw2tbl1_st, dw2tbl1_st, dw2tbl1_st, dw2tbl1_st  dw2'

或者更好的方法是使用re.findall和负捕获组: ,最后用空格或任何你想要的东西连接结果列表:

>>> " ".join(re.findall(r'((?:\w+\.\w+))',s))
'dw1.tbl1_st dw2.tbl1_st dw2.tbl1_st dw2.tbl1_st dw2.tbl1_st
dw2.tbl1_st dw2.tbl1_st dw2.tbl1_st dw2.tbl1_st dw2.tbl1_st 
dw2.tbl1_st dw2.tbl1_st dw2.tbl1_st dw2.tbl1_st dw2.tbl1_st
dw2.tbl1_st dw2.tbl1_st'

相关问题 更多 >