filter digit number in string

本文介绍了几种在Python中从字符串中提取数字的方法。利用正则表达式和内置函数filter,可以高效地移除非数字字符,仅保留数字部分。

http://stackoverflow.com/questions/1450897/python-removing-characters-except-digits-from-string

 

import re 
re.sub("/D", "", "aas30dsa20") 
'3020' 

 

/D matches any non-digit character so, the code above, is essentially replacing every non-digit character for the empty string.

 

Or you can use filter, like so (in Python 2k):

filter(lambda x: x.isdigit(), "aas30dsa20") 

Since in Python 3k, filter returns an iterator instead of a list, you can use the following instead:

>>> ''.join(filter(lambda x: x.isdigit(), "aas30dsa20")) 
'3020' 


s=''.join(i for i in s if i.isdigit()) 

Another generator variant.

 

>>> s = "foo200bar" 
>>> new_s = "".join(i for i in s if i in "0123456789") 

 

>>> text = "9jk78k.9k87h.ji09j9oj" 
>>> print "".join(i for i in text if i in ".0123456789").replace(".",",",1).replace(".","").replace(",",".") 
978.987099 

import tkinter as tk from tkinter import filedialog, messagebox from itertools import combinations class DataShrinkTool: def __init__(self, root): self.root = root self.root.title("数据缩水工具") # 初始化变量 self.file_path = tk.StringVar() self.number_length = tk.IntVar(value=5) self.consecutive_options = {"count": tk.IntVar(value=0), "group": tk.IntVar(value=0)} self.even_odd_options = {i: tk.StringVar(value="any") for i in range(6)} self.mod_options = {i: tk.StringVar(value="any") for i in range(6)} self.span_options = {"min": tk.IntVar(value=0), "max": tk.IntVar(value=9)} self.distance_options = {"min": tk.IntVar(value=0), "max": tk.IntVar(value=9)} self.bold_numbers = tk.StringVar(value="") self.bold_count = tk.IntVar(value=1) self.create_widgets() def create_widgets(self): frame = tk.Frame(self.root) frame.pack(padx=10, pady=10) # 文件选择 tk.Label(frame, text="选择文件:").grid(row=0, column=0, sticky="w") tk.Entry(frame, textvariable=self.file_path, width=50).grid(row=0, column=1, padx=5) tk.Button(frame, text="浏览", command=self.open_file).grid(row=0, column=2) # 数字长度选择 tk.Label(frame, text="数字长度:").grid(row=1, column=0, sticky="w") tk.Radiobutton(frame, text="5位", variable=self.number_length, value=5).grid(row=1, column=1, sticky="w") tk.Radiobutton(frame, text="6位", variable=self.number_length, value=6).grid(row=1, column=2, sticky="w") # 连号筛选 tk.Label(frame, text="连号筛选:").grid(row=2, column=0, sticky="w") tk.Spinbox(frame, from_=0, to=5, textvariable=self.consecutive_options["count"], width=5).grid(row=2, column=1) tk.Spinbox(frame, from_=0, to=5, textvariable=self.consecutive_options["group"], width=5).grid(row=2, column=2) # 奇偶选择 tk.Label(frame, text="奇偶选择:").grid(row=3, column=0, sticky="w") for i in range(6): tk.OptionMenu(frame, self.even_odd_options[i], "any", "odd", "even").grid(row=3, column=i + 1) # 012路筛选 tk.Label(frame, text="012路筛选:").grid(row=4, column=0, sticky="w") for i in range(6): tk.OptionMenu(frame, self.mod_options[i], "any", "0", "1", "2").grid(row=4, column=i + 1) # 首位跨度 tk.Label(frame, text="首位跨度:").grid(row=5, column=0, sticky="w") tk.Spinbox(frame, from_=0, to=9, textvariable=self.span_options["min"], width=5).grid(row=5, column=1) tk.Spinbox(frame, from_=0, to=9, textvariable=self.span_options["max"], width=5).grid(row=5, column=2) # 邻位距离 tk.Label(frame, text="邻位距离:").grid(row=6, column=0, sticky="w") tk.Spinbox(frame, from_=0, to=9, textvariable=self.distance_options["min"], width=5).grid(row=6, column=1) tk.Spinbox(frame, from_=0, to=9, textvariable=self.distance_options["max"], width=5).grid(row=6, column=2) # 胆码选择 tk.Label(frame, text="胆码选择:").grid(row=7, column=0, sticky="w") tk.Entry(frame, textvariable=self.bold_numbers, width=20).grid(row=7, column=1) tk.Spinbox(frame, from_=0, to=6, textvariable=self.bold_count, width=5).grid(row=7, column=2) # 筛选按钮 tk.Button(frame, text="开始筛选", command=self.filter_numbers).grid(row=8, column=1, pady=10) def open_file(self): file_path = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt")]) if file_path: self.file_path.set(file_path) def filter_numbers(self): try: file_path = self.file_path.get() number_length = self.number_length.get() consecutive_count = self.consecutive_options["count"].get() consecutive_group = self.consecutive_options["group"].get() even_odd = {i: self.even_odd_options[i].get() for i in range(number_length)} mod = {i: self.mod_options[i].get() for i in range(number_length)} span_min, span_max = self.span_options["min"].get(), self.span_options["max"].get() distance_min, distance_max = self.distance_options["min"].get(), self.distance_options["max"].get() bold_numbers = set(map(int, self.bold_numbers.get().split(","))) if self.bold_numbers.get() else set() bold_count = self.bold_count.get() with open(file_path, 'r') as f: numbers = [line.strip() for line in f if len(line.strip()) == number_length] filtered_numbers = [ number for number in numbers if self.check_consecutive(list(map(int, number)), consecutive_count, consecutive_group) and self.check_even_odd(list(map(int, number)), even_odd) and self.check_mod(list(map(int, number)), mod) and self.check_span(list(map(int, number)), span_min, span_max) and self.check_distance(list(map(int, number)), distance_min, distance_max) and self.check_bold_numbers(list(map(int, number)), bold_numbers, bold_count) ] result = "\n".join(filtered_numbers) messagebox.showinfo("筛选结果", result if result else "没有符合条件的数据!") except Exception as e: messagebox.showerror("错误", str(e)) @staticmethod def check_consecutive(digits, count, group): groups = [] current_group = [] for i in range(len(digits)): if not current_group or digits[i] == digits[i - 1] + 1: current_group.append(digits[i]) else: if len(current_group) >= 2: groups.append(current_group) current_group = [digits[i]] if len(current_group) >= 2: groups.append(current_group) return len([g for g in groups if len(g) >= count]) >= group @staticmethod def check_even_odd(digits, even_odd): for i, digit in enumerate(digits): option = even_odd.get(i, "any") if option != "any": if (digit % 2 == 0 and option != "even") or (digit % 2 != 0 and option != "odd"): return False return True @staticmethod def check_mod(digits, mod): for i, digit in enumerate(digits): option = mod.get(i, "any") if option != "any" and str(digit % 3) != option: return False return True @staticmethod def check_span(digits, min_span, max_span): return min_span <= abs(digits[0] - digits[-1]) <= max_span @staticmethod def check_distance(digits, min_distance, max_distance): return all(min_distance <= abs(digits[i] - digits[i + 1]) <= max_distance for i in range(len(digits) - 1)) @staticmethod def check_bold_numbers(digits, bold_numbers, bold_count): return len(set(digits) & bold_numbers) >= bold_count if __name__ == "__main__": root = tk.Tk() app = DataShrinkTool(root) root.mainloop()对界面进行优化,全中文界面显示
05-22
import tkinter as tk from tkinter import filedialog, messagebox from itertools import combinations class DataShrinkTool: def __init__(self, root): self.root = root self.root.title("数据缩水工具") # 初始化变量 self.file_path = tk.StringVar() self.number_length = tk.IntVar(value=5) self.consecutive_options = {"count": tk.IntVar(value=0), "group": tk.IntVar(value=0)} self.even_odd_options = {i: tk.StringVar(value="任意") for i in range(6)} self.mod_options = {i: tk.StringVar(value="任意") for i in range(6)} self.span_options = {"min": tk.IntVar(value=0), "max": tk.IntVar(value=9)} self.distance_options = {"min": tk.IntVar(value=0), "max": tk.IntVar(value=9)} self.bold_numbers = tk.StringVar(value="") self.bold_count = tk.IntVar(value=1) self.create_widgets() def create_widgets(self): frame = tk.Frame(self.root) frame.pack(padx=10, pady=10) # 文件选择 tk.Label(frame, text="选择文件:").grid(row=0, column=0, sticky="w") tk.Entry(frame, textvariable=self.file_path, width=50).grid(row=0, column=1, padx=5) tk.Button(frame, text="浏览", command=self.open_file).grid(row=0, column=2) # 数字长度选择 tk.Label(frame, text="数字长度:").grid(row=1, column=0, sticky="w") tk.Radiobutton(frame, text="5位", variable=self.number_length, value=5).grid(row=1, column=1, sticky="w") tk.Radiobutton(frame, text="6位", variable=self.number_length, value=6).grid(row=1, column=2, sticky="w") # 连号筛选 tk.Label(frame, text="连号筛选(组数/每组个数):").grid(row=2, column=0, sticky="w") tk.Spinbox(frame, from_=0, to=5, textvariable=self.consecutive_options["group"], width=5).grid(row=2, column=1) tk.Spinbox(frame, from_=0, to=5, textvariable=self.consecutive_options["count"], width=5).grid(row=2, column=2) # 奇偶选择 tk.Label(frame, text="奇偶选择:").grid(row=3, column=0, sticky="w") for i in range(6): tk.OptionMenu(frame, self.even_odd_options[i], "任意", "奇数", "偶数").grid(row=3, column=i + 1) # 012路筛选 tk.Label(frame, text="012路筛选:").grid(row=4, column=0, sticky="w") for i in range(6): tk.OptionMenu(frame, self.mod_options[i], "任意", "0", "1", "2").grid(row=4, column=i + 1) # 首位跨度 tk.Label(frame, text="首位跨度(最小值/最大值):").grid(row=5, column=0, sticky="w") tk.Spinbox(frame, from_=0, to=9, textvariable=self.span_options["min"], width=5).grid(row=5, column=1) tk.Spinbox(frame, from_=0, to=9, textvariable=self.span_options["max"], width=5).grid(row=5, column=2) # 邻位距离 tk.Label(frame, text="邻位距离(最小值/最大值):").grid(row=6, column=0, sticky="w") tk.Spinbox(frame, from_=0, to=9, textvariable=self.distance_options["min"], width=5).grid(row=6, column=1) tk.Spinbox(frame, from_=0, to=9, textvariable=self.distance_options["max"], width=5).grid(row=6, column=2) # 胆码选择 tk.Label(frame, text="胆码选择(逗号分隔):").grid(row=7, column=0, sticky="w") tk.Entry(frame, textvariable=self.bold_numbers, width=20).grid(row=7, column=1) tk.Spinbox(frame, from_=0, to=6, textvariable=self.bold_count, width=5).grid(row=7, column=2) # 筛选按钮 tk.Button(frame, text="开始筛选", command=self.filter_numbers).grid(row=8, column=1, pady=10) def open_file(self): file_path = filedialog.askopenfilename(filetypes=[("文本文件", "*.txt")]) if file_path: self.file_path.set(file_path) def filter_numbers(self): try: file_path = self.file_path.get() number_length = self.number_length.get() consecutive_group = self.consecutive_options["group"].get() consecutive_count = self.consecutive_options["count"].get() even_odd = {i: self.even_odd_options[i].get() for i in range(number_length)} mod = {i: self.mod_options[i].get() for i in range(number_length)} span_min, span_max = self.span_options["min"].get(), self.span_options["max"].get() distance_min, distance_max = self.distance_options["min"].get(), self.distance_options["max"].get() bold_numbers = set(map(int, self.bold_numbers.get().split(","))) if self.bold_numbers.get() else set() bold_count = self.bold_count.get() with open(file_path, 'r', encoding='utf-8') as f: numbers = [line.strip() for line in f if len(line.strip()) == number_length] filtered_numbers = [ number for number in numbers if self.check_consecutive(list(map(int, number)), consecutive_count, consecutive_group) and self.check_even_odd(list(map(int, number)), even_odd) and self.check_mod(list(map(int, number)), mod) and self.check_span(list(map(int, number)), span_min, span_max) and self.check_distance(list(map(int, number)), distance_min, distance_max) and self.check_bold_numbers(list(map(int, number)), bold_numbers, bold_count) ] result = "\n".join(filtered_numbers) messagebox.showinfo("筛选结果", result if result else "没有符合条件的数据!") except Exception as e: messagebox.showerror("错误", f"发生错误:{str(e)}") @staticmethod def check_consecutive(digits, count, group): groups = [] current_group = [] for i in range(len(digits)): if not current_group or digits[i] == digits[i - 1] + 1: current_group.append(digits[i]) else: if len(current_group) >= 2: groups.append(current_group) current_group = [digits[i]] if len(current_group) >= 2: groups.append(current_group) return len([g for g in groups if len(g) >= count]) >= group @staticmethod def check_even_odd(digits, even_odd): for i, digit in enumerate(digits): option = even_odd.get(i, "任意") if option != "任意": if (digit % 2 == 0 and option != "偶数") or (digit % 2 != 0 and option != "奇数"): return False return True @staticmethod def check_mod(digits, mod): for i, digit in enumerate(digits): option = mod.get(i, "任意") if option != "任意" and str(digit % 3) != option: return False return True @staticmethod def check_span(digits, min_span, max_span): return min_span <= abs(digits[0] - digits[-1]) <= max_span @staticmethod def check_distance(digits, min_distance, max_distance): return all(min_distance <= abs(digits[i] - digits[i + 1]) <= max_distance for i in range(len(digits) - 1)) @staticmethod def check_bold_numbers(digits, bold_numbers, bold_count): return len(set(digits) & bold_numbers) >= bold_count if __name__ == "__main__": root = tk.Tk() app = DataShrinkTool(root) root.mainloop()添加界面显示框用于显示数据
05-22
import tkinter as tk from tkinter import filedialog, messagebox from itertools import combinations class DataShrinkTool: def __init__(self, root): self.root = root self.root.title("数据缩水工具") # 初始化变量 self.file_path = tk.StringVar() self.number_length = tk.IntVar(value=5) self.consecutive_options = {} self.even_odd_options = {} self.mod_options = {} self.span_options = {} self.distance_options = {} self.bold_numbers = tk.StringVar(value="") self.bold_count = tk.IntVar(value=1) self.create_widgets() def create_widgets(self): frame = tk.Frame(self.root) frame.pack(padx=10, pady=10) # 文件选择 tk.Label(frame, text="选择文件:").grid(row=0, column=0, sticky="w") tk.Entry(frame, textvariable=self.file_path, width=50).grid(row=0, column=1, padx=5) tk.Button(frame, text="浏览", command=self.open_file).grid(row=0, column=2) # 数字长度选择 tk.Label(frame, text="数字长度:").grid(row=1, column=0, sticky="w") tk.Radiobutton(frame, text="5位", variable=self.number_length, value=5).grid(row=1, column=1, sticky="w") tk.Radiobutton(frame, text="6位", variable=self.number_length, value=6).grid(row=1, column=2, sticky="w") # 连号筛选 tk.Label(frame, text="连号筛选:").grid(row=2, column=0, sticky="w") self.consecutive_options["count"] = tk.IntVar(value=0) tk.Spinbox(frame, from_=0, to=5, textvariable=self.consecutive_options["count"], width=5).grid(row=2, column=1, sticky="w") self.consecutive_options["group"] = tk.IntVar(value=0) tk.Spinbox(frame, from_=0, to=5, textvariable=self.consecutive_options["group"], width=5).grid(row=2, column=2, sticky="w") # 奇偶选择 tk.Label(frame, text="奇偶选择:").grid(row=3, column=0, sticky="w") for i in range(6): self.even_odd_options[i] = tk.StringVar(value="any") tk.OptionMenu(frame, self.even_odd_options[i], "any", "odd", "even").grid(row=3, column=i + 1) # 012路筛选 tk.Label(frame, text="012路筛选:").grid(row=4, column=0, sticky="w") for i in range(6): self.mod_options[i] = tk.StringVar(value="any") tk.OptionMenu(frame, self.mod_options[i], "any", "0", "1", "2").grid(row=4, column=i + 1) # 首位跨度 tk.Label(frame, text="首位跨度:").grid(row=5, column=0, sticky="w") self.span_options["min"] = tk.IntVar(value=0) tk.Spinbox(frame, from_=0, to=9, textvariable=self.span_options["min"], width=5).grid(row=5, column=1, sticky="w") self.span_options["max"] = tk.IntVar(value=9) tk.Spinbox(frame, from_=0, to=9, textvariable=self.span_options["max"], width=5).grid(row=5, column=2, sticky="w") # 邻位距离 tk.Label(frame, text="邻位距离:").grid(row=6, column=0, sticky="w") self.distance_options["min"] = tk.IntVar(value=0) tk.Spinbox(frame, from_=0, to=9, textvariable=self.distance_options["min"], width=5).grid(row=6, column=1, sticky="w") self.distance_options["max"] = tk.IntVar(value=9) tk.Spinbox(frame, from_=0, to=9, textvariable=self.distance_options["max"], width=5).grid(row=6, column=2, sticky="w") # 胆码选择 tk.Label(frame, text="胆码选择:").grid(row=7, column=0, sticky="w") tk.Entry(frame, textvariable=self.bold_numbers, width=20).grid(row=7, column=1, sticky="w") tk.Spinbox(frame, from_=0, to=6, textvariable=self.bold_count, width=5).grid(row=7, column=2, sticky="w") # 筛选按钮 tk.Button(frame, text="开始筛选", command=self.filter_numbers).grid(row=8, column=1, pady=10) def open_file(self): file_path = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt")]) if file_path: self.file_path.set(file_path) def filter_numbers(self): file_path = self.file_path.get() number_length = self.number_length.get() consecutive_count = self.consecutive_options["count"].get() consecutive_group = self.consecutive_options["group"].get() even_odd = {i: self.even_odd_options[i].get() for i in range(number_length)} mod = {i: self.mod_options[i].get() for i in range(number_length)} span_min = self.span_options["min"].get() span_max = self.span_options["max"].get() distance_min = self.distance_options["min"].get() distance_max = self.distance_options["max"].get() bold_numbers = set(map(int, self.bold_numbers.get().split(","))) if self.bold_numbers.get() else set() bold_count = self.bold_count.get() try: with open(file_path, 'r') as f: numbers = [line.strip() for line in f if len(line.strip()) == number_length] filtered_numbers = [] for number in numbers: digits = list(map(int, number)) if not self.check_consecutive(digits, consecutive_count, consecutive_group): continue if not self.check_even_odd(digits, even_odd): continue if not self.check_mod(digits, mod): continue if not self.check_span(digits, span_min, span_max): continue if not self.check_distance(digits, distance_min, distance_max): continue if not self.check_bold_numbers(digits, bold_numbers, bold_count): continue filtered_numbers.append(number) result = "\n".join(filtered_numbers) messagebox.showinfo("筛选结果", result) except Exception as e: messagebox.showerror("错误", str(e)) def check_consecutive(self, digits, count, group): groups = [] current_group = [] for i in range(len(digits)): if not current_group or digits[i] == digits[i - 1] + 1: current_group.append(digits[i]) else: if len(current_group) >= 2: groups.append(current_group) current_group = [digits[i]] if len(current_group) >= 2: groups.append(current_group) return len([g for g in groups if len(g) >= count]) >= group def check_even_odd(self, digits, even_odd): for i, digit in enumerate(digits): option = even_odd.get(i, "any") if option != "any": if (digit % 2 == 0 and option != "even") or (digit % 2 != 0 and option != "odd"): return False return True def check_mod(self, digits, mod): for i, digit in enumerate(digits): option = mod.get(i, "any") if option != "any" and str(digit % 3) != option: return False return True def check_span(self, digits, min_span, max_span): return min_span <= abs(digits[0] - digits[-1]) <= max_span def check_distance(self, digits, min_distance, max_distance): for i in range(len(digits) - 1): if not (min_distance <= abs(digits[i] - digits[i + 1]) <= max_distance): return False return True def check_bold_numbers(self, digits, bold_numbers, bold_count): return len(set(digits) & bold_numbers) >= bold_count if __name__ == "__main__": root = tk.Tk() app = DataShrinkTool(root) root.mainloop()对这段代码进行优化
05-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值