python脚本使用hive正则表达式斜杠问题

本文深入探讨了使用Hive SQL与Python正则表达式从数据中提取特定长度数字的方法。通过详细解释Python字符串转义、SQL字符串转义及Python字符串format方法的复杂性,为读者提供了实践案例。
  • 目标:提取字符串中长度5-7的数字
  • python脚本hive样式:
    import datetime
    
    data_dic = {
    	'table_name':'table_name',
    	'data_table_name':'data_table_name',
    	'data_time':int(datetime.date.today().strftime('%Y%m%d'))-1
    }
    sql = """
    	insert table {table_name}
    	(
    		id
    		adtag
    	)
    	select id
    		,case when regexp_instr(adtag,'\\\\d{{5,7}}',1,1,0)>0 then regexp_extract(adtag,'(\\\\d{{5,7}})',1)
    			else adtag 
    			end as adtag
    	from {data_table_name}
    	where ftime = {data_time}
    """.format(**data_dic)
    

正常来说,正则pat里面只需要传入’\d{5,7}‘就可以了,一个斜杠最后用了四个斜杠才生效,转化是这样的:
第一层:python字符串转译:\\——\
第二层:sql字符串转译:\——
这样就四个斜杠最后变成了两个斜杠(python转义),两个斜杠再变成一个斜杠(sql转义);另外一个问题,python字符串format方法转译问题,最后用了双’{}’

### 提取数字、英文和中文字符的 Hive 正则表达式Hive 中,可以使用 `regexp_extract` 函数从字符串中提取符合特定正则表达式的子串。该函数的语法为: ```sql regexp_extract(string subject, string pattern, int index) ``` 其中: - `subject` 是要处理的字符串列; - `pattern` 是正则表达式; - `index` 表示捕获组编号。 若需提取数字、英文字母(大小写)以及中文字符,可分别构造不同的正则表达式进行匹配。 --- #### 提取所有数字 使用 `[0-9]+` 可以匹配任意连续的数字: ```sql SELECT regexp_extract(your_column, '([0-9]+)', 1) AS extracted_numbers FROM your_table; ``` 此语句将提取第一个匹配的数字序列[^1]。 --- #### 提取所有英文字母 使用 `[A-Za-z]+` 可以匹配任意连续的英文字符: ```sql SELECT regexp_extract(your_column, '([A-Za-z]+)', 1) AS extracted_letters FROM your_table; ``` 该查询会提取第一个匹配的字母序列[^1]。 --- #### 提取所有中文字符 中文字符通常位于 Unicode 的 `\u4E00-\u9FFF` 范围内,在 Hive 中可以通过以下方式表示: ```sql SELECT regexp_extract(your_column, '([\u4E00-\u9FFF]+)', 1) AS extracted_chinese FROM your_table; ``` 此查询将提取第一个匹配的连续中文字符段。 --- #### 同时提取多种类型 如果希望在一个查询中提取多个部分,可以使用多个捕获组: ```sql SELECT regexp_extract(your_column, '([0-9]+).*?([A-Za-z]+).*?([\u4E00-\u9FFF]+)', 1) AS numbers, regexp_extract(your_column, '([0-9]+).*?([A-Za-z]+).*?([\u4E00-\u9FFF]+)', 2) AS letters, regexp_extract(your_column, '([0-9]+).*?([A-Za-z]+).*?([\u4E00-\u9FFF]+)', 3) AS chinese FROM your_table; ``` 上述语句按顺序提取数字、字母和中文字符,适用于结构化较强的文本[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值