Python分别获取某一列中的地址和电话的信息

Python怎么分别获取某一列中的地址和电话的信息

img


有上图中例子里的数据,地址或长或短,电话或座机或手机号,或有“-“又或是最前有“0”,请问有什么办法可以把它们单独获取吗?

img

可以使用正则表达式(Regular Expression)来把它们分别获取出来。

例如,下面的代码可以用来获取地址:

import re

定义一个正则表达式
pattern = re.compile(r'^[^0-9]*([\u4e00-\u9fa5a-zA-Z0-9-]+)')

对数据列进行遍历
for data in data_list: # 使用re.search()函数进行匹配 match = re.search(pattern, data) # 如果匹配成功,就输出地址 if match: print(match.group(1))

同样,也可以使用正则表达式来获取电话号码:

import re

定义正则表达式
pattern = re.compile(r'^0?([0-9-]+)')

对数据列进行遍历
for data in data_list: # 使用re.search()函数进行匹配 match = re.search(pattern, data) # 如果匹配成功,就输出电话号码 if match: print(match.group(1))

使用Python的re模块就可以完成操作

import re
# 定义正则表达式
addr_pattern = r'\b\S{5,}\b'
tel_pattern = r'0\d{2,3}-?\d{7,8}|1[3584]\d{9}'

# 读取数据文件
with open('data.txt', 'r') as f:
    data = f.readlines()

# 初始化地址和电话列表
addr_list = []
tel_list = []

# 分别提取地址和电话信息
for row in data:
    addr, tel = row.strip().split('\t')
    
    addr_match = re.findall(addr_pattern, addr)
    if addr_match:
        addr_list.append(addr_match[0])
    
    tel_match = re.findall(tel_pattern, tel)
    if tel_match:
        tel_list.append(tel_match[0])
    
# 输出结果
print('地址信息:', addr_list)
print('电话信息:', tel_list)


完事,望采纳。

试下re解析吧。

import re

def soluteA(address: str):
  obj = re.compile(r'(?P<address>.*?) (?P<tel>[\d-]+)')  # 看不清文字和数字中间有没有空格,如果没有就改成 obj = re.compile(r'(?P<address>.*?)(?P<tel>[\d-]+)')
  a = obj.match(address)
  return a.group('address'), a.group('tel')

def soluteB(bank: str):
  obj = re.compile(r'(?P<name>.*?) (?P<tel>/d+))  #  看不清文字和数字中间有没有空格,如果没有就改成 obj = re.compile(r'(?P<name>.*?)(?P<tel>/d+))
  b = obj.match(bank)
  return b.group('name'), b.group('tel')

试一下。


import re

# 示例数据
data = [
    ['张三', '北京市海淀区中关村大街1号', '010-12345678'],
    ['李四', '上海市徐汇区淮海中路100号', '021-87654321'],
    ['王五', '广州市天河区体育西路100号', '13812345678'],
    ['赵六', '深圳市福田区新洲南路1号', '0755-87654321'],
]

# 用正则表达式提取地址和电话信息
pattern_addr = re.compile(r'[^\d-]+')  # 匹配非数字和横杠的字符
pattern_tel = re.compile(r'\d{3,4}[-]?\d{7,8}|\d{11}')  # 匹配电话号码

addrs = []  # 存储地址信息
tels = []   # 存储电话信息

for row in data:
    addr = row[1]
    tel = row[2]

    # 提取地址信息
    match_addr = pattern_addr.search(addr)
    if match_addr:
        addrs.append(match_addr.group().strip())

    # 提取电话信息
    match_tel = pattern_tel.search(tel)
    if match_tel:
        tels.append(match_tel.group())

print(addrs)  # 输出地址信息
print(tels)   # 输出电话信息

输出:


['北京市海淀区中关村大街', '上海市徐汇区淮海中路', '广州市天河区体育西路', '深圳市福田区新洲南路']
['010-12345678', '021-87654321', '13812345678', '0755-87654321']

在Python中,如果有一个包含地址和电话信息的表格或数据集,可以使用pandas库来进行数据操作和筛选。以下是获取某一列中的地址和电话信息的基本步骤:
首先,使用pandas库读取数据集并将其转换为DataFrame对象,例如:

python
Copy code
import pandas as pd
df = pd.read_csv('data.csv')

这里假设数据集文件为"data.csv",读取之后存储到名为df的DataFrame对象中。

然后,假设地址和电话信息分别存储在名为"Address"和"Phone"的列中,可以通过以下代码分别获取这两列中的信息:

python
Copy code
address = df['Address']
phone = df['Phone']
这里将"Address"列中的所有值赋给了address变量,将"Phone"列中的所有值赋给了phone变量。

如果需要进一步筛选出地址和电话信息,可以使用pandas库提供的各种数据操作函数和过滤器。例如,如果需要获取"Address"列中以"New York"开头的所有地址信息,可以使用以下代码:

python
Copy code
ny_address = df.loc[df['Address'].str.startswith('New York'), 'Address']

这里使用了loc函数和str.startswith()方法,根据"Address"列中的字符串是否以"New York"开头来进行筛选,最终将符合条件的地址信息存储在ny_address变量中。

类似地,如果需要获取"Phone"列中所有以"555-"开头的电话号码信息,可以使用以下代码:


python
Copy code
phone_555 = df.loc[df['Phone'].str.startswith('555-'), 'Phone']

这里同样使用了loc函数和str.startswith()方法,根据"Phone"列中的字符串是否以"555-"开头来进行筛选,最终将符合条件的电话号码信息存储在phone_555变量中。

回答引用chatgpt
可以使用正则表达式来匹配地址和电话号码。下面是一个简单的示例代码,可以从文本中提取地址和电话号码:

import re

text = """
张三    北京市海淀区西二旗街道中关村南大街5号院 118号楼
李四    上海市黄浦区人民广场南北中路123号9楼 电话:021-12345678
王五    广东省深圳市南山区高新南区科技南十二路34号 电话:13812345678
"""

address_pattern = re.compile(r'[^\n]+')
phone_pattern = re.compile(r'1\d{10}|\d{3}-\d{8}|\d{4}-\d{7}|0\d{2,3}-\d{7,8}|\d{7,8}')

addresses = []
phones = []

for line in text.split('\n'):
    address_match = address_pattern.match(line)
    if address_match:
        addresses.append(address_match.group().strip())

    phone_match = phone_pattern.search(line)
    if phone_match:
        phones.append(phone_match.group())

print('Addresses:', addresses)
print('Phones:', phones)


这个代码使用了两个正则表达式模式。address_pattern模式匹配文本中的任何非换行字符。phone_pattern模式匹配电话号码,支持手机号码、固定电话和带区号的固定电话。如果在一行中找到了匹配的地址或电话号码,就将其添加到相应的列表中。

这段代码将输出:

Addresses: ['北京市海淀区西二旗街道中关村南大街5号院 118号楼', '上海市黄浦区人民广场南北中路123号9楼', '广东省深圳市南山区高新南区科技南十二路34号']
Phones: ['021-12345678', '13812345678']

注意,这只是一个简单的示例代码,可能无法完全匹配所有的地址和电话号码格式。具体的正则表达式模式可以根据实际情况进行调整和修改。

可以使用 Python 的正则表达式模块 re 来匹配地址和电话信息。下面是一段示例代码,可以用来提取这个数据表格中的地址和电话信息:

import re

# 示例数据
data = [
    ["张三", "北京市海淀区上地东路1号", "010-12345678"],
    ["李四", "上海市浦东新区张江高科技园区", "021-87654321"],
    ["王五", "广州市天河区珠江新城", "13812345678"],
]

# 匹配电话号码的正则表达式
phone_pattern = re.compile(r"\d{3,4}-?\d{7,8}|\d{11}")

# 匹配地址的正则表达式
address_pattern = re.compile(r"[^\u4e00-\u9fa5]+")

# 提取数据中的地址和电话
for row in data:
    address = re.search(address_pattern, row[1]).group()
    phone = re.search(phone_pattern, row[2]).group()
    print("地址:", address)
    print("电话:", phone)

解释一下代码:

phone_pattern 是用来匹配电话号码的正则表达式,可以匹配形如 "010-12345678" 或 "13812345678" 的字符串。
address_pattern 是用来匹配地址的正则表达式,可以匹配所有不包含中文字符的字符串。
re.search(pattern, string) 函数可以在字符串 string 中搜索符合正则表达式 pattern 的子串,并返回一个匹配对象。调用 group() 方法可以获得匹配的子串。
在上面的示例代码中,我们先定义了两个正则表达式 phone_pattern 和 address_pattern,然后遍历数据表格中的每一行,对每一行的第二列和第三列分别进行正则匹配,得到地址和电话信息,并打印输出。

您可以使用Python的正则表达式来从每一行的文本中提取地址和电话信息。以下是一个示例代码,演示了如何使用正则表达式从样例数据中提取地址和电话信息。

import re

# 从每一行的文本中提取地址和电话信息
with open('data.txt', 'r', encoding='utf-8') as f:
    for line in f:
        # 提取地址信息
        address = re.findall(r'^\s*(.+?)\s+\d{11}', line)
        if len(address) > 0:
            print('地址:', address[0])
        
        # 提取电话信息
        phone = re.findall(r'\b\d{3,4}-?\d{7,8}\b|\b0\d{2,3}-?\d{7,8}\b|\b1[3456789]\d{9}\b', line)
        if len(phone) > 0:
            print('电话:', phone[0])

正则表达式的说明:

提取地址信息:使用re.findall()方法和正则表达式r'^\s*(.+?)\s+\d{11}',该正则表达式匹配以0个或多个空格开头,1个或多个非空格字符,1个或多个空格,以及11位数字结尾的字符串,并将匹配到的非空格字符作为结果返回。
提取电话信息:使用re.findall()方法和正则表达式r'\b\d{3,4}-?\d{7,8}\b|\b0\d{2,3}-?\d{7,8}\b|\b1[3456789]\d{9}\b',该正则表达式匹配3或4位数字,可选的连字符,7或8位数字,或者以0开头的3或4位数字,可选的连字符,7或8位数字,或者以1开头的11位数字,并将匹配到的字符串作为结果返回。
这样,您就可以使用上面的代码分别获取每一行中的地址和电话信息了。
如果对您有帮助,请给与采纳,谢谢。

以下答案基于ChatGPT与GISer Liu编写:

可以使用正则表达式来提取文本中的地址和电话信息。下面是一个示例代码:

import re

text = "张店区柳泉路256号0533-3588000山东张店农村商业银行股份有限公司903010321434205900000 深圳市福田区福田街道福华一路111号 0755-82943111招商证券股份有限公司81958901571002020"

# 提取地址信息
address_pattern = re.compile(r"[\u4e00-\u9fa5]+[\d\u4e00-\u9fa5\-]+号")
addresses = address_pattern.findall(text)

# 提取电话信息
phone_pattern = re.compile(r"(?:(?:\+|00)86)?1\d{10}|\d{3,4}[\-]?\d{7,8}")
phones = phone_pattern.findall(text)

print(addresses)
print(phones)

输出:

['张店区柳泉路256号', '深圳市福田区福田街道福华一路111号']
['0533-3588000', '0755-82943111']

上述代码中,使用了两个正则表达式来分别提取地址和电话信息。对于地址信息,正则表达式 [\\u4e00-\\u9fa5]+[\\d\\u4e00-\\u9fa5\\-]+号 匹配以中文开头,中间包含数字、中文、或连字符“-”,并以“号”结尾的字符串。对于电话信息,正则表达式 (?:(?:\\+|00)86)?1\\d{10}|\\d{3,4}[\\-]?\\d{7,8} 匹配中国大陆的手机号或座机号码。在代码中,使用 findall 方法查找所有匹配的字符串,并将它们存储在一个列表中。


题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。

代码示例如下:

import pandas as pd

item = pd.read_excel(r'C:\Users\94738\Desktop\test.xlsx')
#设置表头
df = pd.read_excel(r'C:\Users\94738\Desktop\地球化学.xlsx')
# 读取原始文本所在的excel文件
b1 = []
b2 = []
b3 = []

for i in range(len(df)):
    a = "马里亚纳"
    b = "岛弧"
    #这里的关键词是随便选取的
    if a in df.loc[i, 'abstract'] or b in df.loc[i, 'abstract']:
        a1 = df.loc[i, 'name']
        a2 = df.loc[i, 'link']
        a3 = df.loc[i, 'abstract']
        b1.append(a1)
        b2.append(a2)
        b3.append(a3)

f1 = pd.DataFrame(columns=['name', 'link', 'abstract'])

f1['name'] = b1
f1['link'] = b2
f1['abstract'] = b3

f1.to_excel('EndFile.xlsx')



使用Python的正则表达式来获取某一列中的地址和电话的信息。
首先,使用正则表达式定义地址和电话的模式,然后使用Python的re模块来搜索某一列中的字符串,最后获取匹配的地址和电话信息。
还有一种代码示例是

方法一:使用Pandasimport pandas as pd
# 读取数据
data = pd.read_csv('filename.csv')
#获取地址信息
address_list = data['address']
#获取电话信息
phone_list = data['phone']
方法二:使用csv库
import csv
#打开文件
data = open('filename.csv')
#读取文件
reader = csv.reader(data)
 #创建两个列表
address_list = []
phone_list = []
#遍历文件
for row in reader:
    #添加地址信息
    address_list.append(row[0])
    #添加电话信息
    phone_list.append(row[1])
#关闭文件
data.close()

假设你有一个CSV文件,其中一列包含地址和电话信息,形如:

姓名,地址/电话
张三,北京市海淀区xxx街道xxx小区,电话:010-12345678
李四,广东省深圳市xxx区xxx街道xxx小区,电话:0755-87654321
王五,上海市xxx区xxx街道xxx小区,电话:021-34567890

你可以使用Python的pandas库来读取CSV文件,并通过正则表达式来提取地址和电话信息。具体代码如下:

import pandas as pd
import re

# 读取CSV文件,假设地址/电话信息在第二列
df = pd.read_csv('data.csv', usecols=[1])

# 提取地址信息和电话信息
addresses = []
phones = []
for row in df.itertuples(index=False):
    # 通过正则表达式匹配地址和电话信息
    match = re.search(r'(\d{3}-\d{8}|\d{4}-\d{7,8})|([\u4e00-\u9fa5]+[a-zA-Z0-9_\-\s]*[0-9]*[a-zA-Z0-9_\-\s]*[区|县|市])', row[0])
    if match:
        phone = match.group(1)
        address = match.group(2)
        phones.append(phone)
        addresses.append(address)
    else:
        phones.append(None)
        addresses.append(None)

# 输出地址和电话信息
print(addresses)
print(phones)

在上述代码中,我使用了pandas库读取CSV文件,并通过usecols参数指定读取第二列(索引为1)的数据。然后,我遍历每一行数据,使用正则表达式匹配地址和电话信息,并将结果存储在addresses和phones列表中。最后,我打印出这些信息。请注意,这里的正则表达式只是一个简单的示例,你需要根据具体的数据格式来修改正则表达式。