簡體   English   中英

使用正則表達式從一個大字符串中提取數據

[英]Extract data from one big string with regex

考慮以下字符串,它是從pdf中提取的內容表,例如在以下示例中,兩個主題可以在一行上,每行的末尾有一個換行符(例如在示例中)

A — N° 1 2 janvier 2013

TABLE OF CONTENT

Topic à one ......... 30 Second Topic .......... 33
Third - one ......... 3 Topic.with.dots .......... 33
One more line ......................... 27 last topic ...... 34

我要提取該部分的名稱“主題à一個”,“第二個主題”,“第三個”,“ Topic.with.dots”,“多一行”和“最后一個主題”

對匹配的正則表達式有什么見解?

# -*- coding: utf-8 -*-
string = "A — N° 1 2 janvier 2013

TABLE OF CONTENT

Topic à one ......... 30 Second Topic .......... 33
Third - one ......... 3 Topic.with.dots .......... 33
One more line ......................... 27 last topic ...... 34"
puts string.scan(/(\p{l}[\p{l} \.-]*)\s+\.+\s+\d+/i).flatten

這就是您想要的。 它還與單個字母標題匹配。

以下(尚未優化的)正則表達式適用於您的示例:

(?i)(?=[A-Z])(?:\.[A-Z-]+|[A-Z -]+)+\b

但是,它需要改進,例如是否應匹配非ASCII字母,並且有一些可能的性能優化取決於所使用的正則表達式風格。

在regex101上看到它

對於Ruby 2,我建議/(?=\\p{L})(?:\\.[\\p{L}-]++|[\\p{L} -]+)+\\b/

string.scan(/(\S.*?)\s+\.{2,}\s+\d+/).flatten
# =>
[
  "Topic one",
  "Second Topic",
  "Third one",
  "Topic.with.dots",
  "One more line",
  "last topic"
]

類似於@sawa的:

puts text.scan(/([a-zA-Z .]+?) \.\.++ \d+/).flatten.map(&:strip)
# >> Topic one
# >> Second Topic
# >> Third one
# >> Topic.with.dots
# >> One more line
# >> last topic

(不過,我更喜歡他的樣式。)

這是Perl中的解決方案:

 $ cat tmp
 Topic one ......... 30 Second Topic .......... 33 Third one ......... 3   Topic.with.dots ..........   33 One more line ......................... 27 last topic ...... 34


$ cat tmp  | perl -ne 'while (m/((?:\w|[. ])+?) [.]+ \d+/g) { print "$1\n" }' 
Topic one
Second Topic
Third one
 Topic.with.dots
One more line
last topic

關於我在這里所做的操作的一些解釋是,內部的括號(?:...)無法捕獲,因此它們僅用於分組,並且將字字符( \\w )或空格或點[. ] [. ] ,然后,由於您有更多點,因此匹配為非貪婪+? 整個匹配項進入$1 ,將其打印出來。

HTH

- 編輯 -

Ruby幾乎具有Perl的所有構造,包括regex,這是直接的轉換! (不確定為什么必須將其否決!)FWIW,在Ruby中:

while ARGF.gets
  puts $_.scan(/((?:\w|[. ])+?) [.]+ \d+/)
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM