【问题标题】:identify letter/number combinations using regex and storing in dictionary使用正则表达式识别字母/数字组合并存储在字典中
【发布时间】:2019-12-30 05:02:32
【问题描述】:
import pandas as pd
df = pd.DataFrame({'Date':['This 1-A16-19 person is BL-17-1111 and other',
                          'dont Z-1-12 do here but NOT 12-24-1981',
                          'numbers: 1A-256-29Q88 ok'], 
                  'IDs': ['A11','B22','C33'],
                  }) 

使用上面的dataframe我想做以下1)使用regex识别所有数字+数字组合,例如1-A16-192)存储在字典中

理想情况下,我想要以下输出(请注意,正则表达式故意没有选择 12-24-1981,因为它没有字母,例如 1A-24-1981

{1: 1-A16-19, 2:BL-17-1111, 3: Z-1-12, 4: 1A-256-29Q88}

谁能帮我做这个?

【问题讨论】:

  • 使用dataframe.extractall(regex)。我看不到你想要的字符串的模式。去Regex 101玩图案
  • 我猜该模式是由-分隔的字母和数字的任意组合
  • “但不是 12-24-1981”怎么样?
  • 12-24-1981 不应被拾取,因为它没有与之关联的字母。如果是1A-24-1981,那么是的正则表达式应该是它
  • 如果你的匹配总是xxx-xxx-xxx,那么你可以试试\S+-\S+-\S+

标签: regex python-3.x string pandas dictionary


【解决方案1】:

这个正则表达式可能会解决问题。

(?=.*[a-zA-Z])(\S+-\S+-\S+)

它匹配两个空格之间的所有内容,其中包含两个-。如果没有字母,也不会匹配。

regex101 example

如您所见,对于给定的输入,您仅提供了 1-A16-19BL-17-1111Z-1-121A-256-29Q88 正在返回。

【讨论】:

  • 整行代码会是什么样子?例如x = re.search(\S*-\S*-\S*, dataframe)`
  • 而上面的代码会无意中获取12-24-1981
【解决方案2】:

你可以试试:

vals = df['Date'].str.extractall(r'(\S+-\S+-\S+)')[0].tolist() 
# extract your strings based on your condition above and pass to a list.
# make a list with the index range of your matches.
nums = []
for x,y in enumerate(vals):
    nums.append(x)

将两个列表传递到字典中。

my_dict = dict(zip(nums,vals))
print(my_dict)
 {0: '1-A16-19',
 1: 'BL-17-1111',
 2: 'Z-1-12',
 3: '12-24-1981',
 4: '1A-256-29Q88'}

如果您希望索引从 1 开始,您可以在 enumerate 函数中指定。

for x,y in enumerate(vals,1):
    nums.append(x)
print(nums)
[1, 2, 3,4,5]

【讨论】:

  • 当我输入vals = df['Date'].str.extract(r'(\S+-\S+-\S+)')[0].tolist()时,我得到一个AttributeError: 'str' object has no attribute 'tolist'
  • 打印没有.tolist()的行会得到什么
  • 我收到'1-A16-19'
  • 更新了我的答案 - 上面应该可以工作,无论如何它对我有用。
  • 使用vals = dataframe['Date'].str.extract(r'(\S+-\S+-\S+)') 有效!
猜你喜欢
  • 1970-01-01
  • 2022-01-27
  • 2011-09-16
  • 2014-05-24
  • 1970-01-01
  • 2013-10-27
  • 2021-04-29
  • 1970-01-01
相关资源
最近更新 更多