关于#正则表达式#的问题,如何解决?

通过正则表达式 提取文本中两个单引号间的变量,并删除特定逻辑的字符
文本长是这个:str="df.loc[(df['age']<23)&(df['salary']>=4000)&(df['height']<160)]"
需求 和 我想要达到的结果:

①提取str文本中 两个小于号判断的变量 :age、height
②删除str文本中两个小于号判断的逻辑,返回”df.loc[(df['salary']>=4000)]"

达成以上需求的python 代码,以及代码稍微讲解一下 ,感谢感谢了!!
import re

str="df.loc[(df['age']<23)&(df['salary']>=4000)&(df['height']<160)]"

res1 = re.findall(r"\['([^>]*?)'\]<",str)
res2 = re.sub(r"&?\([^>]*\)&?","",str)
print(res1)
print(res2)

输出:

['age', 'height']
df.loc[(df['salary']>=4000)]

讲解:

  1. 匹配单引号内,除了>的所有字符,并用()捕获需要的内容
  2. 匹配中括号内,除了>的所有字符,并替换成空字符串

import re
str1 = "df.loc[(df['age']<23)&(df['salary']>=4000)&(df['height']<160)]"
# re.findall(要找的内容,原字符串)
# 如果找到,返回列表。如果没找到返回[]

lis1 = re.findall("'([a-zA-Z]*?)']<", str1)
print(lis1)  # ['age', 'height']

str2 = re.sub('&*\([^>]*?\)&*','', str1)
print(str2)  # df.loc[(df['salary']>=4000)]


python re模块学习 --常用的正则表达式_悠闲的小鱼Liu的博客-CSDN博客 re.findall()re.split()re.sub()1、re.findall(pattern, string) :在字符串(string)中找到正则表达式所匹配的所有子串(pattern),并返回一个列表[pattern0, pattern1, ……];如果没有找到匹配的,则返回空列表[]。import res = 'python-123!abc@(456)#efg$789&*,python,'lis1 = re.findall('pytho.. https://blog.csdn.net/m0_60392490/article/details/120392254?spm=1001.2014.3001.5502

import re

str = "df.loc[(df['age']<23)&(df['salary']>=4000)&(df['height']<160)]"

# 匹配所有的类似"df['age']<23","df['salary']>=4000" 解析变化的部分
findall = re.findall(r"\(df\['([^\]]*)'\]([><=]*)(\d*)\)", str)
print(findall)
variables = []
remain = []
for i in findall:
    if i[1] == '<':
        variables.append(i[0])
    else:
        remain.append(f"(df['{i[0]}']{i[1]}{i[2]})")
print(variables)
result = f"df.loc[{'&'.join(remain)}]"
print(result)

参考一下

import re
content = "df.loc[(df['salary']>=4000)&(df['age']<23)&(df['age']<23)&(df['age']<23)&(df['salary']>=4000)&(df['age']<23)&(df['salary']>=4000)&(df['salary']>=4000)&(df['height']<160)&(df['salary']>=4000)]"
# 正则匹配 ['xxx']<包含的内容,即中括号单引号包裹,后面是小于号的内容。并返回匹配结果
result1 = re.findall(r"\['(\w+)'\]<", content)
print(result1) 

# 匹配满足除大于号>之外,括号()包裹的内容。括号前的&?,表示匹配一次或0次‘&’
result2 = re.sub(r"&?\([^>]*\)","",content)  # [^>]的意思,比如[a]是匹配a,那么[^a]就是匹配非a
#去除掉多余的&符号
print(result2.replace('[&(','[('))

写代码试了一下,不知道能不能满足你的要求。


# -*- coding: utf-8 -*-
import re
str1 = "df.loc[(df['age']<23)&(df['salary']>=4000)&(df['height']<160)]"
# 先提取每个()括号内的的条件内容,然后再提取对应变量
res_kuohao = re.findall("\((.+?)\)",str1)
# 提取两个小于号判断的变量 :age、height
res1 = [re.findall("\\[\'(.+?)\'\\]<", each)[0] for each in res_kuohao if re.findall("\\[\'(.+?)\'\\]<", each)]
print(res1)
##['age', 'height']

# 筛选满足条件的condition,不包含小括号的
res2_cond = [each for each in res_kuohao if '<' not in each]
res2 = r"df.loc[{}]".format(res2_cond[0])
print(res2)
#df.loc[df['salary']>=4000]

参考一下呢 https://www.jb51.net/article/238575.htm

Python正则表达式大全_普通网友的博客-CSDN博客_python正则表达式 定义:正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。上面都是官方的说明,我自己的理解是(仅供参考):通过事先规定好一些特殊字符的匹配规则,然后利用这些字符进行组合来匹配各种复杂的字符串场景。比如现在的爬虫和数据分析,字符串校验等等都需要用 https://blog.csdn.net/m0_67354902/article/details/123577026

这么多正确答案

java使用正则表达式截取单引号之间的的内容
https://blog.csdn.net/weixin_45453133/article/details/113418049