2017-01-01 3 views
2

У меня есть текст тысяч строк, который идет как:Как извлечь текст вокруг слова в excel или python?

ksjd 234first special 34-37xy kjsbn 
sde 89second special 22-23xh ewio 
647red special 55fg dsk 
uuire another special 98 
another special 107r 
green special 55-59 ewk 
blue special 31-39jkl 

Мне нужно извлечь слово перед «специальный» и номер (или диапазон номеров) справа. Другими словами, я хочу:

enter image description here

преобразуется в таблицу:

enter image description here

ответ

1

В добавление того, что @RolandSmith написал, вот способ использования регулярных выражений в Excel - VBA


Option Explicit 
Function ExtractSpecial(S As String, Index As Long) As String 
    Dim RE As Object, MC As Object 
    Const sPat As String = "([a-z]+)\s+(special)\s+([^a-z]+)" 

Set RE = CreateObject("vbscript.regexp") 
With RE 
    .Global = True 
    .ignorecase = True 
    .MultiLine = False 
    .Pattern = sPat 
    If .test(S) = True Then 
     Set MC = .Execute(S) 
     ExtractSpecial = MC(0).submatches(Index - 1) 
    End If 
End With 

End Function 

Index аргумент в этом UDF соответствует возврату либо 1-й, 2-й или 3-й submatch из коллекции матча, так что вы можете легко разделить исходную строку в трех ваших желаемых компонентов.

enter image description here

Поскольку вы пишете у вас есть «тысячи строк», вы можете предпочесть, чтобы запустить макрос. Макрос обрабатывает данные намного быстрее, но не динамически. Приведенный ниже макрос предполагает, что ваши исходные данные находятся в столбце A на Sheet2 и будут помещать результаты в столбцы C: E на том же рабочем листе. Вы можете легко изменить эти параметры:


Sub ExtractSpec() 
    Dim RE As Object, MC As Object 
    Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range 
    Dim vSrc As Variant, vRes As Variant 
    Dim I As Long 

Set wsSrc = Worksheets("sheet2") 
Set wsRes = Worksheets("sheet2") 
    Set rRes = wsRes.Cells(1, 3) 

With wsSrc 
    vSrc = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) 
End With 

Set RE = CreateObject("vbscript.regexp") 
With RE 
    .Global = True 
    .MultiLine = False 
    .ignorecase = True 
    .Pattern = "([a-z]+)\s+(special)\s+([^a-z]+)" 

ReDim vRes(1 To UBound(vSrc), 1 To 3) 
For I = 1 To UBound(vSrc) 
    If .test(vSrc(I, 1)) = True Then 
     Set MC = .Execute(vSrc(I, 1)) 
     vRes(I, 1) = MC(0).submatches(0) 
     vRes(I, 2) = MC(0).submatches(1) 
     vRes(I, 3) = MC(0).submatches(2) 
    End If 
Next I 
End With 

Set rRes = rRes.Resize(UBound(vRes, 1), UBound(vRes, 2)) 
With rRes 
    .EntireColumn.Clear 
    .Value = vRes 
    .EntireColumn.AutoFit 
End With 

End Sub 

+0

Это идеальное решение. Единственная проблема, с которой я сталкиваюсь, - это автоматическое преобразование некоторых чисел в Даты.Я пробовал предлагаемые методы [такие как установка столбца в текст], но все еще есть эта проблема. – KitKat

+0

Я удалил .EntireColumn.Clear и это сработало! – KitKat

+0

@KitKat Попробуйте обернуть MC (0) ... в функции CStr. Или добавить с одинарной кавычкой –

3

быстрый способ сделать это состоит в использовании регулярных выражений:

In [1]: import re 

In [2]: text = '''234first special 34-37xy       
    ...: 89second special 22-23xh 
    ...: 647red special 55fg 
    ...: another special 98 
    ...: another special 107r 
    ...: green special 55-59 
    ...: blue special 31-39jkl''' 

In [3]: [re.findall('\d*\s*(\S+)\s+(special)\s+(\d+(?:-\d+)?)', line)[0] for line in text.splitlines()] 
Out[3]: 
[('first', 'special', '34-37'), 
('second', 'special', '22-23'), 
('red', 'special', '55'), 
('another', 'special', '98'), 
('another', 'special', '107'), 
('green', 'special', '55-59'), 
('blue', 'special', '31-39')] 
3

В Excel, вы можете, используя формулу для извлечения текста между двумя словами, выполнив следующие:

  1. Выберите пустую ячейку и введите эту формулу = MID (A1, SEARCH («KTE», A1) + 3, SEARCH («feature», A1) -SEARCH («KTE», A1) -4), затем нажмите кнопку «Ввод».

  2. Перетащите дескриптор заполнения, чтобы заполнить диапазон, который вы хотите применить к этой формуле. Теперь извлекаются только текстовые строки между «KTE» и «feature».

Примечание:

  1. В этой формуле A1 является сотой вы хотите извлечь текст из.

  2. KTE и функция - это слова, которые вы хотите извлечь текст между ними.

  3. Число 3 - длина символов KTE, а число 4 равно длине символов KTE плюс одна.

 Смежные вопросы

  • Нет связанных вопросов^_^