我有一个字符串
s = 'count_EVENT_GENRE in [1,2,3,4,5]'
#I have to capture only the field 'count_EVENT_GENRE'
field = re.split(r'[(==)(>=)(<=)(in)(like)]', s)[0].strip()
#o/p is 'cou'
# for s = 'sum_EVENT_GENRE in [1,2,3,4,5]' o/p = 'sum_EVENT_GENRE'
这很好
我的疑问是,对于 (in)(like)
中的任何字符,它都会在该字符处分割字符串 s
并给我第一个切片。(如“cou”之后"它找到一个匹配的字符 i:e n
)。对于包含 (in)(like)
中任何字符的任何字符串都会发生这种情况。
例如:'percentage_AMOUNT' o/p = 'p'
因为它在 p
之后找到了一个匹配的字符“e”。
所以我想要一些建议,当分割发生/发生时,如何将(in)(like)视为单词而不是字符。
请建议一种语法。
最佳答案
回答您的问题,[(==)(>=)(<=)(in)(like)]
是与您在类中定义的单个字符匹配的字符类。要匹配字符序列,您需要删除 [
和]
并使用交替:
r'==?|>=?|<=?|\b(?:in|like)\b'
或更好:
r'[=><]=?|\b(?:in|like)\b'
你code看起来像:
import re
ss = ['count_EVENT_GENRE in [1,2,3,4,5]','coint_EVENT_GENRE = "ROMANCE"']
for s in ss:
field = re.split(r'[=><]=?|\b(?:in|like)\b', s)[0].strip()
print(field)
但是,可能还有其他(更简单或更安全 - 取决于实际规范)方法来获取您想要的内容(用空格分割并获取第一项,使用 re.match
与 r'\w+'
或 r'[a-z]+(?:_[A-Z]+)+'
,等)
如果您的值位于字符串的开头并以小写 ASCII 字母开头,则可以有任意数量的 _
序列后跟大写 ASCII 字母,使用:
re.match(r'[a-z]+(?:_[A-Z]+)*', s)
import re
ss = ['count_EVENT_GENRE in [1,2,3,4,5]','coint_EVENT_GENRE = "ROMANCE"']
for s in ss:
fieldObj = re.match(r'[a-z]+(?:_[A-Z]+)*', s)
if fieldObj:
print(fieldObj.group())
关于python - 使用python的re模块分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38474353/