rex/0000755000176200001440000000000013172201330011040 5ustar liggesusersrex/inst/0000755000176200001440000000000013172175577012044 5ustar liggesusersrex/inst/doc/0000755000176200001440000000000013172175577012611 5ustar liggesusersrex/inst/doc/log_parsing.Rmd0000644000176200001440000000431112670366101015543 0ustar liggesusers--- title: "Server Log Parsing" author: "Jim Hester" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Server Log Parsing} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- Parsing server log files is a common task in server administration. [1](http://link.springer.com/article/10.1007/BF03325089),[2](http://stackoverflow.com/search?q=%22Apache+log%22) Historically R would not be well suited to this and it would be better performed using a scripting language such as perl. Rex, however, makes this easy to do and allows you to perform both the data cleaning and analysis in R! Common server logs consist of space separated fields. > 198.214.42.14 - - [21/Jul/1995:14:31:46 -0400] "GET /images/ HTTP/1.0" 200 17688 > lahal.ksc.nasa.gov - - [24/Jul/1995:12:42:40 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 The logs used in this vignette come from two months of all HTTP requests to the NASA Kennedy Space Center WWW server in Florida and are freely available for use. [3](http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.html) ```{r include = FALSE} library(rex) library(dplyr) library(knitr) library(ggplot2) ``` ```{r show.warnings=FALSE} parsed <- scan("NASA.txt", what = "character", sep = "\n") %>% re_matches( rex( # Get the time of the request "[", capture(name = "time", except_any_of("]") ), "]", space, double_quote, "GET", space, # Get the filetype of the request if requesting a file maybe( non_spaces, ".", capture(name = "filetype", except_some_of(space, ".", "?", double_quote) ) ) ) ) %>% mutate(filetype = tolower(filetype), time = as.POSIXct(time, format="%d/%b/%Y:%H:%M:%S %z")) ``` This gives us a nicely formatted data frame of the time and filetypes of the requests. ```{r echo = FALSE} kable(head(parsed, n = 10)) ``` We can also easily generate a histogram of the filetypes, or a plot of requests over time. ```{r FALSE, fig.show='hold', warning = FALSE, message = FALSE} ggplot(na.omit(parsed)) + stat_count(aes(x=filetype)) ggplot(na.omit(parsed)) + geom_histogram(aes(x=time)) + ggtitle("Requests over time") ``` rex/inst/doc/log_parsing.R0000644000176200001440000000214113172175576015235 0ustar liggesusers## ----include = FALSE----------------------------------------------------- library(rex) library(dplyr) library(knitr) library(ggplot2) ## ----show.warnings=FALSE------------------------------------------------- parsed <- scan("NASA.txt", what = "character", sep = "\n") %>% re_matches( rex( # Get the time of the request "[", capture(name = "time", except_any_of("]") ), "]", space, double_quote, "GET", space, # Get the filetype of the request if requesting a file maybe( non_spaces, ".", capture(name = "filetype", except_some_of(space, ".", "?", double_quote) ) ) ) ) %>% mutate(filetype = tolower(filetype), time = as.POSIXct(time, format="%d/%b/%Y:%H:%M:%S %z")) ## ----echo = FALSE-------------------------------------------------------- kable(head(parsed, n = 10)) ## ----FALSE, fig.show='hold', warning = FALSE, message = FALSE------------ ggplot(na.omit(parsed)) + stat_count(aes(x=filetype)) ggplot(na.omit(parsed)) + geom_histogram(aes(x=time)) + ggtitle("Requests over time") rex/inst/doc/url_parsing.R0000644000176200001440000000576113172175577015272 0ustar liggesusers## ----url_parsing_stock, eval=F------------------------------------------- # "^(?:(?:http(?:s)?|ftp)://)(?:\\S+(?::(?:\\S)*)?@)?(?:(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)(?:\\.(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)*(?:\\.(?:[a-z0-9\u00a1-\uffff]){2,})(?::(?:\\d){2,5})?(?:/(?:\\S)*)?$" ## ----url_parsing_url----------------------------------------------------- library(rex) valid_chars <- rex(except_some_of(".", "/", " ", "-")) re <- rex( start, # protocol identifier (optional) + // group(list("http", maybe("s")) %or% "ftp", "://"), # user:pass authentication (optional) maybe(non_spaces, maybe(":", zero_or_more(non_space)), "@"), #host name group(zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)), #domain name zero_or_more(".", zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)), #TLD identifier group(".", valid_chars %>% at_least(2)), # server port number (optional) maybe(":", digit %>% between(2, 5)), # resource path (optional) maybe("/", non_space %>% zero_or_more()), end ) ## ----url_parsing_validate------------------------------------------------ good <- c("http://foo.com/blah_blah", "http://foo.com/blah_blah/", "http://foo.com/blah_blah_(wikipedia)", "http://foo.com/blah_blah_(wikipedia)_(again)", "http://www.example.com/wpstyle/?p=364", "https://www.example.com/foo/?bar=baz&inga=42&quux", "http://✪df.ws/123", "http://userid:password@example.com:8080", "http://userid:password@example.com:8080/", "http://userid@example.com", "http://userid@example.com/", "http://userid@example.com:8080", "http://userid@example.com:8080/", "http://userid:password@example.com", "http://userid:password@example.com/", "http://➡.ws/䨹", "http://⌘.ws", "http://⌘.ws/", "http://foo.com/blah_(wikipedia)#cite-1", "http://foo.com/blah_(wikipedia)_blah#cite-1", "http://foo.com/unicode_(✪)_in_parens", "http://foo.com/(something)?after=parens", "http://☺.damowmow.com/", "http://code.google.com/events/#&product=browser", "http://j.mp", "ftp://foo.bar/baz", "http://foo.bar/?q=Test%20URL-encoded%20stuff", "http://مثال.إختبار", "http://例子.测试", "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", "http://1337.net", "http://a.b-c.de", "http://223.255.255.254") bad <- c( "http://", "http://.", "http://..", "http://../", "http://?", "http://??", "http://??/", "http://#", "http://##", "http://##/", "http://foo.bar?q=Spaces should be encoded", "//", "//a", "///a", "///", "http:///a", "foo.com", "rdar://1234", "h://test", "http:// shouldfail.com", ":// should fail", "http://foo.bar/foo(bar)baz quux", "ftps://foo.bar/", "http://-error-.invalid/", "http://-a.b.co", "http://a.b-.co", "http://0.0.0.0", "http://3628126748", "http://.www.foo.bar/", "http://www.foo.bar./", "http://.www.foo.bar./") all(grepl(re, good) == TRUE) all(grepl(re, bad) == FALSE) rex/inst/doc/log_parsing.html0000644000176200001440000013176613172175576016020 0ustar liggesusers Server Log Parsing

Server Log Parsing

Jim Hester

2017-10-19

Parsing server log files is a common task in server administration. 1,2 Historically R would not be well suited to this and it would be better performed using a scripting language such as perl. Rex, however, makes this easy to do and allows you to perform both the data cleaning and analysis in R!

Common server logs consist of space separated fields.

198.214.42.14 - - [21/Jul/1995:14:31:46 -0400] “GET /images/ HTTP/1.0” 200 17688

lahal.ksc.nasa.gov - - [24/Jul/1995:12:42:40 -0400] “GET /images/USA-logosmall.gif HTTP/1.0” 200 234

The logs used in this vignette come from two months of all HTTP requests to the NASA Kennedy Space Center WWW server in Florida and are freely available for use. 3

parsed <- scan("NASA.txt", what = "character", sep = "\n") %>%
  re_matches(
    rex(

      # Get the time of the request
      "[",
        capture(name = "time",
          except_any_of("]")
        ),
      "]",

      space, double_quote, "GET", space,

      # Get the filetype of the request if requesting a file
      maybe(
        non_spaces, ".",
        capture(name = "filetype",
          except_some_of(space, ".", "?", double_quote)
        )
      )
    )
  ) %>%
  mutate(filetype = tolower(filetype),
         time = as.POSIXct(time, format="%d/%b/%Y:%H:%M:%S %z"))

This gives us a nicely formatted data frame of the time and filetypes of the requests.

time filetype
1995-07-21 14:31:46
1995-07-24 12:42:40 gif
1995-07-02 02:30:34 gif
1995-07-05 13:51:39
1995-07-10 23:11:49 gif
1995-07-15 11:27:49 mpg
1995-07-13 11:02:50 xbm
1995-07-23 09:11:06
1995-07-14 10:38:04 gif
1995-07-25 09:33:01 gif

We can also easily generate a histogram of the filetypes, or a plot of requests over time.

ggplot(na.omit(parsed)) + stat_count(aes(x=filetype))
ggplot(na.omit(parsed)) + geom_histogram(aes(x=time)) + ggtitle("Requests over time")

rex/inst/doc/url_parsing.html0000644000176200001440000004127513172175577016035 0ustar liggesusers URL Validation

URL Validation

Jim Hester

2017-10-19

Consider the task of correctly validating a URL. From that page two conclusions can be made.

  1. Validating URLs require complex regular expressions.
  2. Creating a correct regular expression is hard! (only 1 out of 13 regexs were valid for all cases).

Because of this one may be tempted to simply copy the best regex you can find (gist).

The problem with this is that while you can copy it now, what happens later when you find a case that is not handled correctly? Can you correctly interpret and modify this?

"^(?:(?:http(?:s)?|ftp)://)(?:\\S+(?::(?:\\S)*)?@)?(?:(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)(?:\\.(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)*(?:\\.(?:[a-z0-9\u00a1-\uffff]){2,})(?::(?:\\d){2,5})?(?:/(?:\\S)*)?$"

However if you re-create the regex with rex it is much easier to understand and modify later if needed.

library(rex)

valid_chars <- rex(except_some_of(".", "/", " ", "-"))

re <- rex(
  start,

  # protocol identifier (optional) + //
  group(list("http", maybe("s")) %or% "ftp", "://"),

  # user:pass authentication (optional)
  maybe(non_spaces,
    maybe(":", zero_or_more(non_space)),
    "@"),

  #host name
  group(zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)),

  #domain name
  zero_or_more(".", zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)),

  #TLD identifier
  group(".", valid_chars %>% at_least(2)),

  # server port number (optional)
  maybe(":", digit %>% between(2, 5)),

  # resource path (optional)
  maybe("/", non_space %>% zero_or_more()),

  end
)

We can then validate that it correctly identifies both good and bad URLs. (IP address validation removed)

good <- c("http://foo.com/blah_blah",
  "http://foo.com/blah_blah/",
  "http://foo.com/blah_blah_(wikipedia)",
  "http://foo.com/blah_blah_(wikipedia)_(again)",
  "http://www.example.com/wpstyle/?p=364",
  "https://www.example.com/foo/?bar=baz&inga=42&quux",
  "http://✪df.ws/123",
  "http://userid:password@example.com:8080",
  "http://userid:password@example.com:8080/",
  "http://userid@example.com",
  "http://userid@example.com/",
  "http://userid@example.com:8080",
  "http://userid@example.com:8080/",
  "http://userid:password@example.com",
  "http://userid:password@example.com/",
  "http://➡.ws/䨹",
  "http://⌘.ws",
  "http://⌘.ws/",
  "http://foo.com/blah_(wikipedia)#cite-1",
  "http://foo.com/blah_(wikipedia)_blah#cite-1",
  "http://foo.com/unicode_(✪)_in_parens",
  "http://foo.com/(something)?after=parens",
  "http://☺.damowmow.com/",
  "http://code.google.com/events/#&product=browser",
  "http://j.mp",
  "ftp://foo.bar/baz",
  "http://foo.bar/?q=Test%20URL-encoded%20stuff",
  "http://مثال.إختبار",
  "http://例子.测试",
  "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com",
  "http://1337.net",
  "http://a.b-c.de",
  "http://223.255.255.254")

bad <- c(
  "http://",
  "http://.",
  "http://..",
  "http://../",
  "http://?",
  "http://??",
  "http://??/",
  "http://#",
  "http://##",
  "http://##/",
  "http://foo.bar?q=Spaces should be encoded",
  "//",
  "//a",
  "///a",
  "///",
  "http:///a",
  "foo.com",
  "rdar://1234",
  "h://test",
  "http:// shouldfail.com",
  ":// should fail",
  "http://foo.bar/foo(bar)baz quux",
  "ftps://foo.bar/",
  "http://-error-.invalid/",
  "http://-a.b.co",
  "http://a.b-.co",
  "http://0.0.0.0",
  "http://3628126748",
  "http://.www.foo.bar/",
  "http://www.foo.bar./",
  "http://.www.foo.bar./")

all(grepl(re, good) == TRUE)
## [1] TRUE
all(grepl(re, bad) == FALSE)
## [1] TRUE

You can now see the power and expressiveness of building regular expressions with rex!

rex/inst/doc/url_parsing.Rmd0000644000176200001440000000772513051324404015572 0ustar liggesusers--- title: "URL Validation" author: "Jim Hester" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{URL Validation} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- Consider the task of correctly [validating a URL](https://mathiasbynens.be/demo/url-regex). From that page two conclusions can be made. 1. Validating URLs require complex regular expressions. 2. Creating a correct regular expression is hard! (only 1 out of 13 regexs were valid for all cases). Because of this one may be tempted to simply copy the best regex you can find ([gist](https://gist.github.com/dperini/729294)). The problem with this is that while you can copy it now, what happens later when you find a case that is not handled correctly? Can you correctly interpret and modify this? ```{r url_parsing_stock, eval=F} "^(?:(?:http(?:s)?|ftp)://)(?:\\S+(?::(?:\\S)*)?@)?(?:(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)(?:\\.(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)*(?:\\.(?:[a-z0-9\u00a1-\uffff]){2,})(?::(?:\\d){2,5})?(?:/(?:\\S)*)?$" ``` However if you re-create the regex with `rex` it is much easier to understand and modify later if needed. ```{r url_parsing_url} library(rex) valid_chars <- rex(except_some_of(".", "/", " ", "-")) re <- rex( start, # protocol identifier (optional) + // group(list("http", maybe("s")) %or% "ftp", "://"), # user:pass authentication (optional) maybe(non_spaces, maybe(":", zero_or_more(non_space)), "@"), #host name group(zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)), #domain name zero_or_more(".", zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)), #TLD identifier group(".", valid_chars %>% at_least(2)), # server port number (optional) maybe(":", digit %>% between(2, 5)), # resource path (optional) maybe("/", non_space %>% zero_or_more()), end ) ``` We can then validate that it correctly identifies both good and bad URLs. (_IP address validation removed_) ```{r url_parsing_validate} good <- c("http://foo.com/blah_blah", "http://foo.com/blah_blah/", "http://foo.com/blah_blah_(wikipedia)", "http://foo.com/blah_blah_(wikipedia)_(again)", "http://www.example.com/wpstyle/?p=364", "https://www.example.com/foo/?bar=baz&inga=42&quux", "http://✪df.ws/123", "http://userid:password@example.com:8080", "http://userid:password@example.com:8080/", "http://userid@example.com", "http://userid@example.com/", "http://userid@example.com:8080", "http://userid@example.com:8080/", "http://userid:password@example.com", "http://userid:password@example.com/", "http://➡.ws/䨹", "http://⌘.ws", "http://⌘.ws/", "http://foo.com/blah_(wikipedia)#cite-1", "http://foo.com/blah_(wikipedia)_blah#cite-1", "http://foo.com/unicode_(✪)_in_parens", "http://foo.com/(something)?after=parens", "http://☺.damowmow.com/", "http://code.google.com/events/#&product=browser", "http://j.mp", "ftp://foo.bar/baz", "http://foo.bar/?q=Test%20URL-encoded%20stuff", "http://مثال.إختبار", "http://例子.测试", "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", "http://1337.net", "http://a.b-c.de", "http://223.255.255.254") bad <- c( "http://", "http://.", "http://..", "http://../", "http://?", "http://??", "http://??/", "http://#", "http://##", "http://##/", "http://foo.bar?q=Spaces should be encoded", "//", "//a", "///a", "///", "http:///a", "foo.com", "rdar://1234", "h://test", "http:// shouldfail.com", ":// should fail", "http://foo.bar/foo(bar)baz quux", "ftps://foo.bar/", "http://-error-.invalid/", "http://-a.b.co", "http://a.b-.co", "http://0.0.0.0", "http://3628126748", "http://.www.foo.bar/", "http://www.foo.bar./", "http://.www.foo.bar./") all(grepl(re, good) == TRUE) all(grepl(re, bad) == FALSE) ``` You can now see the power and expressiveness of building regular expressions with `rex`! rex/tests/0000755000176200001440000000000012634157001012211 5ustar liggesusersrex/tests/testthat.R0000644000176200001440000000006212633635633014205 0ustar liggesuserslibrary(testthat) library(rex) test_check("rex") rex/tests/testthat/0000755000176200001440000000000013172201330014042 5ustar liggesusersrex/tests/testthat/test-aaa.R0000644000176200001440000000077712450271411015704 0ustar liggesuserscontext("aaa") test_that("register adds a function to the .rex$env enviornment", { a <- identity register(a) expect_true("a" %in% ls(envir=.rex$env)) rm("a", envir = .rex$env) }) test_that("register_object adds all the objects to the .rex$env environment", { b <- list(x=1, y = 2) register_object(b) expect_true("x" %in% ls(envir=.rex$env)) expect_true("y" %in% ls(envir=.rex$env)) expect_false("b" %in% ls(envir=.rex$env)) rm("x", envir = .rex$env) rm("y", envir = .rex$env) }) rex/tests/testthat/test-wildcards.R0000644000176200001440000000311612431463122017125 0ustar liggesuserscontext("zero_or_more") test_that("recognizes basic characters", { expect_equal(rex(zero_or_more("a"), "b"), regex("(?:a)*b")) }) test_that("recognizes special identifiers", { expect_equal(rex(zero_or_more(number), "b"), regex("(?:[[:digit:]])*b")) }) test_that("recognizes shortcuts", { re <- rex(zero_or_more(number, type = "lazy"), "E") expect_equal(re, regex("(?:[[:digit:]])*?E")) expect_equal(regmatches(m=regexpr(re, "123EEE", perl = TRUE), "123EEE"), "123E") }) context("one_or_more") test_that("recognizes basic characters", { expect_equal(rex(one_or_more("a"), "b"), regex("(?:a)+b")) }) test_that("recognizes special identifiers", { expect_equal(rex(one_or_more(letter), "b"), regex("(?:[[:alpha:]])+b")) }) context("maybe") test_that("recognizes basic characters", { re <- rex("x", maybe("y"), "z") expect_equal(re, regex("x(?:y)?z")) expect_true(grepl(re, "xyz")) expect_true(grepl(re, "xz")) }) context("not") test_that("creates a negative lookahead", { re <- rex("x", not("y"), "z") expect_equal(re, regex("x(?:(?!y).)*z")) expect_true(grepl(re, "xazbc", perl=TRUE)) expect_true(grepl(re, "xxzabc", perl=TRUE)) expect_false(grepl(re, "xyzabc", perl=TRUE)) re <- rex("x432", not("yars"), "tsrz") expect_true(grepl(re, "x432tsrz", perl=TRUE)) expect_true(grepl(re, "x432yartsrz", perl=TRUE)) expect_false(grepl(re, "x432yarstsrz", perl=TRUE)) re <- rex(start, not("ars"), "x432") expect_true(grepl(re, "x432", perl=TRUE)) expect_true(grepl(re, "arx432", perl=TRUE)) expect_false(grepl(re, "arsx432", perl=TRUE)) }) rex/tests/testthat/test-common.R0000644000176200001440000001537612477366212016470 0ustar liggesuserscontext("rex") test_that("start works", { r <- rex( start, letter ) expect_true(grepl(r, "abcdef")) expect_false(grepl(r, "123456", perl = TRUE)) }) test_that("end works", { r <- rex( "Z", end ) expect_true(grepl(r, "abcZ")) expect_false(grepl(r, "abc")) }) test_that("version parsing works", { r <- rex( start, capture(numbers), any, capture(numbers), any, capture(numbers), any, capture(numbers), end ) expect_identical( gsub(r, "\\1 \\2 \\3 \\4", "3.1.1-1", perl = TRUE), "3 1 1 1" ) }) test_that("verbs in rex work", { r <- rex( start, "foo", zero_or_more(any), "bar", end ) expect_true(grepl(r, "fooABCbar", perl = TRUE)) expect_true(grepl(r, "foo123\tbar", perl = TRUE)) }) test_that("Simple URL parsing works", { # TODO: get these working better again ## Decompose a URL into its components. ## Example by LT (http://www.cs.uiowa.edu/~luke/R/regexp.html). x <- "http://stat.umn.edu:80/xyz" re <- "^(?:(((?:(?:(?!:).)*)+)://))?((?:(?:(?!:/).)*)+)(?:(:((?:[[:digit:]]+)+)))?(?:(/(?:.)*))?$" #m <- regexec(re, x) #m #regmatches(x, m) ## Element 3 is the protocol, 4 is the host, 6 is the port, and 7 ## is the path. We can use this to make a function for extracting the ## parts of a URL: URL_parts <- function(x) { m <- regexec(re, x) parts <- do.call(rbind, lapply(regmatches(x, m), `[`, c(3L, 4L, 6L, 7L))) colnames(parts) <- c("protocol","host","port","path") parts } #URL_parts(x) r <- rex( start, ## match the protocol -- may exist or may not maybe(capture( capture(except_some_of(":")), "://" )), ## match the path capture(one_or_more(not(":/"))), ## get the port maybe(capture(":", capture(numbers))), ## and the rest maybe(capture("/", anything)), end ) rbind(r = r, m = re) n <- gregexpr(r, x, perl = TRUE)[[1]] split_matches <- function(string, matches) { starts <- attr(matches, "capture.start") lengths <- attr(matches, "capture.length") ends <- starts + lengths - 1 c(string, substring(string, starts, ends)) } #split_matches(x, n) #regmatches(x, m)[[1]] #expect_equal(regmatches(x, m)[[1]], split_matches(x, n)) }) context("URL Validation") test_that("URL Validation works", { valid_chars <- rex(except_some_of(".", "/", " ", "-")) re <- rex( start, # protocol identifier (optional) + // group(list("http", maybe("s")) %or% "ftp", "://"), # user:pass authentication (optional) maybe(non_spaces, maybe(":", zero_or_more(non_space)), "@"), #host name group(zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)), #domain name zero_or_more(".", zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)), #TLD identifier group(".", valid_chars %>% at_least(2)), # server port number (optional) maybe(":", digit %>% between(2, 5)), # resource path (optional) maybe("/", non_space %>% zero_or_more()), end ) good <- c("http://foo.com/blah_blah", "http://foo.com/blah_blah/", "http://foo.com/blah_blah_(wikipedia)", "http://foo.com/blah_blah_(wikipedia)_(again)", "http://www.example.com/wpstyle/?p=364", "https://www.example.com/foo/?bar=baz&inga=42&quux", "http://✪df.ws/123", "http://userid:password@example.com:8080", "http://userid:password@example.com:8080/", "http://userid@example.com", "http://userid@example.com/", "http://userid@example.com:8080", "http://userid@example.com:8080/", "http://userid:password@example.com", "http://userid:password@example.com/", "http://➡.ws/䨹", "http://⌘.ws", "http://⌘.ws/", "http://foo.com/blah_(wikipedia)#cite-1", "http://foo.com/blah_(wikipedia)_blah#cite-1", "http://foo.com/unicode_(✪)_in_parens", "http://foo.com/(something)?after=parens", "http://☺.damowmow.com/", "http://code.google.com/events/#&product=browser", "http://j.mp", "ftp://foo.bar/baz", "http://foo.bar/?q=Test%20URL-encoded%20stuff", "http://مثال.إختبار", "http://例子.测试", "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", "http://1337.net", "http://a.b-c.de", "http://223.255.255.254") bad <- c( "http://", "http://.", "http://..", "http://../", "http://?", "http://??", "http://??/", "http://#", "http://##", "http://##/", "http://foo.bar?q=Spaces should be encoded", "//", "//a", "///a", "///", "http:///a", "foo.com", "rdar://1234", "h://test", # nolint "http:// shouldfail.com", ":// should fail", "http://foo.bar/foo(bar)baz quux", "ftps://foo.bar/", "http://-error-.invalid/", "http://-a.b.co", "http://a.b-.co", "http://0.0.0.0", "http://3628126748", "http://.www.foo.bar/", "http://www.foo.bar./", "http://.www.foo.bar./") lapply(good, function(x) { expect_true(grepl(re, x, perl = TRUE), info=x) }) lapply(bad, function(x) { expect_false(grepl(re, x, perl = TRUE), info=x) }) }) context("start") test_that("matches basic characters", { expect_equal(rex(start, "f"), regex("^f")) }) test_that("escapes special characters", { expect_equal(rex(start, "."), regex("^\\.")) }) test_that("matches basic characters", { expect_equal(rex(start, "x" %>% n_times(3)), regex("^(?:x){3}")) }) test_that("matches special identifiers", { expect_equal(rex(start, number %>% n_times(2)), regex("^(?:[[:digit:]]){2}")) }) context("appending expressions") test_that("adds basic characters", { expect_equal(rex("x", "y", "z"), regex("xyz")) expect_equal(rex("x", maybe("y"), "z"), regex("x(?:y)?z")) }) test_that("escapes special characters", { expect_equal(rex(numbers %>% between(0, 2), ".", "$", end), regex("(?:[[:digit:]]+){0,2}\\.\\$$")) }) context("shortcuts - end") test_that("matches basic characters", { expect_equal(rex("x", "y", end), regex("xy$")) }) test_that("escapes special characters", { expect_equal(rex("x", "$", end), regex("x\\$$")) }) context("general regex") test_that("returns a well-formed regex", { expect_equal(rex(start, "w", "x" %or% "y", "z", end), regex("^w(?:x|y)z$")) }) context("rex examples") re <- rex(start, number %>% n_times(3), "-", letter %>% n_times(2), maybe("#"), "a" %or% "b", "c" %>% between(2, 4), "$", end ) expect_true(grepl(re, "123-xy#accc$", perl=TRUE)) expect_true(grepl(re, "999-dfbcc$")) expect_false(grepl(re, "000-df#baccccccccc$")) expect_false(grepl(re, "444-dd3ac$")) context("issues") test_that("#11 Modifiers and named character classes", { p <- rex(none_of(alpha)) expect_true(grepl(p, "6", perl = TRUE)) }) rex/tests/testthat/test-character_class.R0000644000176200001440000001174112417772506020312 0ustar liggesuserscontext("one_of") test_that("simple text is correct", { re <- rex(one_of(1:9)) expect_equal(re, regex("[123456789]")) lapply(1:9, function(x) { expect_true(grepl(re, x, perl = TRUE), info=x) }) expect_false(grepl(re, "a", perl = TRUE)) vals <- c("a", "b", "c", 0, 3, 5) re <- rex(one_of(vals)) expect_equal(re, regex("[abc035]")) lapply(vals, function(x) { expect_true(grepl(re, x, perl = TRUE), info = x) }) expect_false(grepl(re, "d", perl = TRUE)) }) test_that("escapes correctly", { vals <- c("[", "]") re <- rex(one_of(vals)) expect_equal(re, regex("[\\[\\]]")) lapply(vals, function(x) { expect_true(grepl(re, x, perl = TRUE), info = x) }) expect_false(grepl(re, "{", perl = TRUE)) }) tests <- c(quote("a"), quote(any), quote(quote), quote(quotes), quote(lower), quote(upper), quote(list(upper, lower)), quote(list("[", "]"))) test_that("any_of equals one_of() plus *", { lapply(tests, function(x) { re1 <- regex(paste0(rex(one_of(eval(x))), "*")) re2 <- rex(any_of(eval(x))) expect_equal(re1, re2, info = paste(sep=" : ", re1, re2)) }) }) test_that("some_of equals one_of plus +", { lapply(tests, function(x) { re1 <- regex(paste0(rex(one_of(eval(x))), "+")) re2 <- rex(some_of(eval(x))) expect_equal(re1, re2, info = paste(sep=" : ", re1, re2)) }) }) test_that("except_any equals none_of() plus *", { lapply(tests, function(x) { re1 <- regex(paste0(rex(none_of(eval(x))), "*")) re2 <- rex(except_any_of(eval(x))) expect_equal(re1, re2, info = paste(sep=" : ", re1, re2)) }) }) test_that("except_some equals none_of() plus +", { lapply(tests, function(x) { re1 <- regex(paste0(rex(none_of(eval(x))), "+")) re2 <- rex(except_some_of(eval(x))) expect_equal(re1, re2, info = paste(sep=" : ", re1, re2)) }) }) context("none_of") test_that("simple text is correct", { re <- rex(none_of(1:9)) expect_equal(re, regex("[^123456789]")) lapply(1:9, function(x) { expect_false(grepl(re, x, perl = TRUE), info=x) }) expect_true(grepl(re, "a", perl = TRUE)) vals <- c("a", "b", "c", 0, 3, 5) re <- rex(none_of(vals)) expect_equal(re, regex("[^abc035]")) lapply(vals, function(x) { expect_false(grepl(re, x, perl = TRUE), info = x) }) expect_true(grepl(re, "d", perl = TRUE)) }) test_that("escapes correctly", { vals <- c("[", "]") re <- rex(none_of(vals)) expect_equal(re, regex("[^\\[\\]]")) lapply(vals, function(x) { expect_false(grepl(re, x, perl = TRUE), info = x) }) expect_true(grepl(re, "{", perl = TRUE)) }) context("range") test_that("matches basic characters", { re <- rex(range(1, 3)) expect_equal(re, regex("[1-3]")) lapply(1:3, function(x) { expect_true(grepl(re, x), info=x) }) lapply(4:9, function(x) { expect_false(grepl(re, x), info=x) }) }) test_that("escapes special characters", { re <- rex(range("[", "}")) expect_equal(re, regex("[\\[-}]")) lapply(c("[", "}"), function(x) { expect_true(grepl(re, x), info=x) }) }) context("exclude_range") test_that("matches basic characters", { re <- rex(exclude_range(1, 3)) expect_equal(re, regex("[^1-3]")) lapply(1:3, function(x) { expect_false(grepl(re, x, perl = TRUE), info=x) }) lapply(4:9, function(x) { expect_true(grepl(re, x, perl = TRUE), info=x) }) }) context("one_of") test_that("matches basic characters", { expect_equal(rex(one_of("a", "b", "rst")), regex("[abrst]")) }) test_that("escapes special characters", { expect_equal(rex(one_of("^", "b", "\\")), regex("[\\^b\\\\]")) }) context("except") test_that("matches basic characters", { expect_equal(rex(except("a", "b", "rst")), regex("[^abrst]")) }) test_that("escapes special characters", { expect_equal(rex(except("^", "b")), regex("[^\\^b]")) }) test_that("none_of is the same as except", { expect_equal(rex(none_of("^", "b", 1:10)), rex(except("^", "b", 1:10))) }) context("character_class") test_that("examples are correct", { # grey = gray re <- rex("gr", one_of("a", "e"), "y") expect_equal(grepl(re, c("grey", "gray")), c(TRUE, TRUE)) # TRUE TRUE # Match non-vowels re <- rex(none_of("a", "e", "i", "o", "u")) # They can also be in the same string re2 <- rex(none_of("aeiou")) expect_identical(re, re2) expect_equal(grepl(re, c("k", "l", "e")), c(TRUE, TRUE, FALSE)) # TRUE TRUE FALSE # Match range re <- rex(range("a", "e")) expect_equal(grepl(re, c("b", "d", "f")), c(TRUE, TRUE, FALSE)) # TRUE TRUE FALSE # Explicit creation (note you have to escape manually here) re <- rex(character_class("abcd\\[")) expect_equal(grepl(re, c("a", "d", "[", "]")), c(TRUE, TRUE, TRUE, FALSE)) # TRUE TRUE TRUE FALSE }) test_that("escapes special characters", { re <- rex(exclude_range("[", "}")) expect_equal(re, regex("[^\\[-}]")) lapply(c("[", "}"), function(x) { expect_false(grepl(re, x, perl = TRUE), info=x) }) expect_true(grepl(re, "A", perl = TRUE)) }) rex/tests/testthat/test-or.R0000644000176200001440000000136112431463173015577 0ustar liggesuserscontext("or") test_that("%or% creates an alternation", { re <- rex("w", "x" %or% "y", "z") expect_equal(re, regex("w(?:x|y)z")) expect_true(grepl(re, "wxz")) expect_true(grepl(re, "wyz")) expect_false(grepl(re, "waz")) }) test_that("or with multiple inputs works", { re <- rex(or("x", "yx", "z")) expect_equal(re, regex("(?:x|yx|z)")) lapply(c("x", "yx", "z"), function(x) { expect_true(grepl(re, x, perl=TRUE), info=x) }) expect_false(grepl(re, c("y"))) expect_false(grepl(re, c("a"))) }) test_that("or with variable inputs works", { variable <- c("test", "variable") re <- rex(or(variable)) expect_equal(re, regex("(?:test|variable)")) lapply(variable, function(x){ expect_true(grepl(re, x), info=x) }) }) rex/tests/testthat/test-rex_mode.R0000644000176200001440000000035412447542420016762 0ustar liggesuserscontext("rex_mode") test_that("rex_mode attaches .rex$env to the search_path", { expect_false(".rex$env" %in% search()) rex_mode() expect_true(".rex$env" %in% search()) rex_mode() expect_false(".rex$env" %in% search()) }) rex/tests/testthat/test-counts.R0000644000176200001440000000157212414536031016471 0ustar liggesuserscontext("n_times") test_that("description", { re1 <- rex("x" %>% n_times(2)) re2 <- rex("x" %>% n(2)) expect_identical(re1, re2) expect_equal(re1, regex("(?:x){2}")) expect_true(grepl(re1, "xx")) expect_false(grepl(re1, "x")) }) context("between") test_that("creates a bounded repetition", { re <- rex("x" %>% between(2, 4)) expect_equal(re, regex("(?:x){2,4}")) expect_true(grepl(re, "xxx")) expect_false(grepl(re, "x")) }) context("at_least") test_that("creates a bounded repetition", { re <- rex("x" %>% at_least(3)) expect_equal(re, regex("(?:x){3,}")) expect_true(grepl(re, "xxx")) expect_false(grepl(re, "xx")) }) context("at_most") test_that("creates a repetition of n times at most", { re <- rex(start, "x" %>% at_most(3), end) expect_equal(re, regex("^(?:x){,3}$")) expect_true(grepl(re, "xxx")) expect_false(grepl(re, "xxxxx")) }) rex/tests/testthat/test-lookarounds.R0000644000176200001440000000366712414504015017522 0ustar liggesuserscontext("lookarounds") test_that("lookarounds work", { r <- rex( start, "foo" %if_next_isnt% "bar" ) expect_true(grepl(r, "fooba", perl = TRUE)) expect_false(grepl(r, "foobar", perl = TRUE)) }) context("if_next_is") test_that("matches basic characters", { re <- rex("a" %if_next_is% "b") expect_equal(re, regex("(?:a(?=b))")) expect_true(grepl(re, "ab", perl=TRUE)) expect_false(grepl(re, "ac", perl=TRUE)) }) test_that("escapes special characters", { re <- rex("[" %if_next_is% "?=") expect_equal(re, regex("(?:\\[(?=\\?=))")) expect_true(grepl(re, "[?=", perl=TRUE)) expect_false(grepl(re, "?=[", perl=TRUE)) }) context("if_next_isnt") test_that("matches basic characters", { re <- rex("a" %if_next_isnt% "b") expect_equal(re, regex("(?:a(?!b))")) expect_true(grepl(re, "ac", perl=TRUE)) expect_false(grepl(re, "ab", perl=TRUE)) }) test_that("escapes special characters", { re <- rex("[" %if_next_isnt% "?=") expect_equal(re, regex("(?:\\[(?!\\?=))")) expect_true(grepl(re, "?=[", perl=TRUE)) expect_false(grepl(re, "[?=", perl=TRUE)) }) context("if_prev_is") test_that("matches basic characters", { re <- rex("a" %if_prev_is% "b") expect_equal(re, regex("(?:(?<=b)a)")) expect_true(grepl(re, "ba", perl=TRUE)) expect_false(grepl(re, "ab", perl=TRUE)) }) test_that("escapes special characters", { re <- rex("[" %if_prev_is% "<=?") expect_equal(re, regex("(?:(?<=<=\\?)\\[)")) expect_true(grepl(re, "<=?[", perl=TRUE)) expect_false(grepl(re, "[b", perl=TRUE)) }) context("if_prev_isnt") test_that("matches basic characters", { re <- rex("a" %if_prev_isnt% "b") expect_equal(re, regex("(?:(?%") export(as.regex) export(character_class) export(character_class_escape) export(escape) export(m) export(matches) export(re_matches) export(re_substitutes) export(regex) export(register_shortcuts) export(rex) export(rex_) export(rex_mode) export(s) export(shortcuts) export(substitutes) importFrom(magrittr,"%>%") rex/NEWS.md0000644000176200001440000000246113172173230012150 0ustar liggesusers## Rex Version 1.1.2 ## * Updating tests to work with testthat version 1.0.2.9000. * Add `m`, `matches` and `s`, `substitutes` aliases for `re_matches` and `re_substitutes`. ## Rex Version 1.1.1 ## * Vignette tweak for ggplot2 2.0.0 * Only print startup message some of the time. * Move register for magrittr pipe to `.onLoad()` ## Rex Version 1.0.1 ## * Work around ggplot2 bug with windows fonts ## Rex Version 1.0.0 ## * Include the capture results even if `locations = TRUE` * Add `:` operator for character ranges * Remove duplicate regex functino * Don't re-compute missing names * Reduce code duplication * Add examples for lookarounds ## Rex Version 0.2.0 ## ### Enhancements * Add a newline shortcut * add register_shortcuts to allow use of rex in external packages without spurious NOTES. ## Rex Version 0.1.1 ## ### Enhancements * re_matches now has a "locations" argument, which returns the start and end locations of the match or capture(s). * Simplify regular expressions generated from 'some_of' functions. ### Bug fixes * backslashes ("\\") are now properly escaped. ### Misc * Improve Rex mode documentation (#21 @Ironholds) * Improve Log parsing Vignette copy and Title (#18, #20 @Ironholds) * Add links to GitHub and issues page in DESCRIPTION ## Rex Version 0.1.0 ## Initial release rex/R/0000755000176200001440000000000013172175600011253 5ustar liggesusersrex/R/shortcuts.R0000644000176200001440000000474112670372021013440 0ustar liggesusersshortcut <- function(...) { data <- list(...) if (length(data) == 1L) { data <- data[[1L]] } structure(data, class = "shortcut") } #' Single shortcuts #' #' Each of these shortcuts has both a plural (-s) and inverse (non_) form. single_shortcuts <- shortcut( ## Character class shortcuts alnum = character_class("[:alnum:]"), alpha = character_class("[:alpha:]"), letter = character_class("[:alpha:]"), blank = character_class("[:blank:]"), cntrl = character_class("[:cntrl:]"), digit = character_class("[:digit:]"), number = character_class("[:digit:]"), graph = character_class("[:graph:]"), lower = character_class("[:lower:]"), print = character_class("[:print:]"), punct = character_class("[:punct:]"), space = character_class("[:space:]"), upper = character_class("[:upper:]"), xdigit = character_class("[:xdigit:]"), newline = regex("\\R"), single_quote = character_class("'"), double_quote = character_class("\""), quote = character_class("'\"") ) basic_shortcuts <- shortcut( dot = escape("."), any = any_char <- regex("."), something = regex(".+"), anything = regex(".*"), start = regex("^"), end = regex("$"), boundary = regex("\\b"), non_boundary = regex("\\B") ) inverse <- function(x) { x[] <- lapply(x, function(xx) { val <- paste0("^", xx); class(val) <- class(xx) val }) names(x) <- paste0("non_", names(x)) x } plural <- function(x) { x[] <- lapply(x, function(xx) { val <- paste0(escape(xx), "+"); class(val) <- "regex" val }) names(x) <- paste0(names(x), "s") x } multiple <- function(x) { x[] <- lapply(x, function(xx) { val <- paste0(escape(xx), "*"); class(val) <- "regex" val }) names(x) <- paste0("any_", names(x), "s") x } #' Shortcuts #' #' Commonly used character classes and regular expressions. These shortcuts #' are substituted inside \code{rex} calls. #' #' \code{names(shortcuts)} will give you the full list of available shortcuts. #' @export #' @family rex shortcuts <- shortcut(c( basic_shortcuts, single_shortcuts, plural(single_shortcuts), multiple(single_shortcuts), inverse(single_shortcuts), plural(inverse(single_shortcuts)), multiple(inverse(single_shortcuts)) )) default_data_format.shortcut <- function(x) { build_rd <- get("build_rd", envir = asNamespace("roxygen2")) rd <- get("rd", envir = asNamespace("roxygen2")) build_rd(rd("\\preformatted{"), paste0(names(x), " - ", x, collapse = "\n"), rd("}")) } register_object(shortcuts) rex/R/utils.R0000644000176200001440000000040013144407303012525 0ustar liggesusersp <- function(...) { regex(paste(sep = "", collapse = "", ...)) } #' Pipe operator #' #' @name %>% #' @rdname pipe #' @keywords internal #' @export #' @importFrom magrittr %>% #' @usage lhs \%>\% rhs NULL `%==%` <- function(x, y) { identical(x, y) } rex/R/aaa.R0000644000176200001440000000055612477367546012151 0ustar liggesusers.rex <- new.env(parent = emptyenv()) .rex$env <- new.env(parent = emptyenv()) .rex$mode <- FALSE register <- function(...) { names <- gsub("`", "", as.character(eval(substitute(alist(...)))), fixed = TRUE) list2env(structure(list(...), .Names = names), envir = .rex$env) } register_object <- function(object) { list2env(as.list(object), envir = .rex$env) } rex/R/rex.R0000644000176200001440000000404213051324404012166 0ustar liggesusers#' @include escape.R #' @include character_class.R #' @include utils.R NULL #' Generate a regular expression. #' @export #' @family rex #' @param ... \code{\link{shortcuts}}, R variables, text, or other \pkg{rex} #' functions. #' @param env environment to evaluate the rex expression in. #' @aliases rex_ rex <- function(..., env = parent.frame()) { args <- lazyeval::lazy_dots(...) rex_(args, env) } #' @export rex_ <- function(args, env = parent.frame()) { args <- lazyeval::as.lazy_dots(args, env) # this needs the as.list because eval only looks at the enclos if envir is # not an environment regex(p(escape(lazyeval::lazy_eval(args, as.list(.rex$env))))) } #' @describeIn regex coerce regex object to a character #' @export as.character.regex <- function(x, ...) x #' Coerce objects to a \code{\link{regex}}. #' @name as.regex #' @param x Object to coerce to \code{\link{regex}}. #' @param ... further arguments passed to methods. #' @export as.regex <- function(x, ...) UseMethod("as.regex") #' @export #' @describeIn as.regex Simply escape the Object. as.regex.default <- function(x, ...) escape(x) #' @export #' @describeIn regex Print regex object print.regex <- function(x, ...){ cat(paste(strwrap(x), collapse = "\n"), "\n", sep = "") } #' Regular Expression #' #' Specify an explicit regular expression. This expression must already be #' escaped. #' @param x Object #' @param ... further arguments #' @seealso \code{\link{as.regex}} to coerce to a regex object. #' @export regex <- function(x, ...) structure(x, class = "regex") #' Register the Rex shortcuts #' #' If you are using rex in another package you need to call this function to #' register all of the rex shortcuts so that spurious NOTEs about global #' variables being generated during R CMD check. #' @param pkg_name the package to register the shortcuts in #' @export register_shortcuts <- function(pkg_name) { invisible(utils::globalVariables(ls(.rex$env), pkg_name)) } #' @export c.regex <- function(..., recursive = FALSE) { regex(c(unlist(lapply(list(...), unclass)))) } rex/R/character_class.R0000644000176200001440000000577412517442257014543 0ustar liggesusers#' @include utils.R #' @include escape.R NULL #' Create character classes #' #' There are multiple ways you can define a character class. #' @inheritParams capture #' @param start beginning of character class #' @param end end of character class #' @param x text to include in the character class (must be escaped manually) #' @inheritParams wildcards #' @export #' @family rex #' @examples #' # grey = gray #' re <- rex("gr", one_of("a", "e"), "y") #' grepl(re, c("grey", "gray")) # TRUE TRUE #' #' # Match non-vowels #' re <- rex(none_of("a", "e", "i", "o", "u")) #' # They can also be in the same string #' re <- rex(none_of("aeiou")) #' grepl(re, c("k", "l", "e")) # TRUE TRUE FALSE #' #' # Match range #' re <- rex(range("a", "e")) #' grepl(re, c("b", "d", "f")) # TRUE TRUE FALSE #' #' # Explicit creation #' re <- rex(character_class("abcd\\[")) #' grepl(re, c("a", "d", "[", "]")) # TRUE TRUE TRUE FALSE #' @describeIn character_class explicitly define a character class character_class <- function(x) structure(x, class = c("character_class", "regex")) #' @describeIn character_class matches one of the specified characters. one_of <- function(...) { p( "[", p(character_class_escape_dots(...)), "]" ) } register(one_of) #' @describeIn character_class matches zero or more of the specified characters. any_of <- function(..., type = c("greedy", "lazy", "possessive")) { add_type(p(one_of(...), "*"), type) } register(any_of) #' @describeIn character_class matches one or more of the specified characters. some_of <- function(..., type = c("greedy", "lazy", "possessive")) { add_type(p(one_of(...), "+"), type) } register(some_of) #' @describeIn character_class matches anything but one of the specified characters. #' @aliases except none_of <- except <- function(...) { p( "[^", p(character_class_escape_dots(...)), "]" ) } register(none_of, except) #' @describeIn character_class matches zero or more of anything but the specified characters. except_any_of <- function(..., type = c("greedy", "lazy", "possessive")) { add_type(p(none_of(...), "*"), type) } register(except_any_of) #' @describeIn character_class matches one or more of anything but the specified characters. except_some_of <- function(..., type = c("greedy", "lazy", "possessive")) { add_type(p(none_of(...), "+"), type) } register(except_some_of) #' @describeIn character_class matches one of any of the characters in the range. range <- function(start, end) { character_class(p(character_class_escape(start), "-", character_class_escape(end))) } register(range) #' @describeIn character_class matches one of any of the characters in the range. `:` <- function(start, end) { if (all(is.character(start), is.character(end))) { range(start, end) } else { .Primitive(":")(start, end) } } register(`:`) #' @describeIn character_class matches one of any of the characters except those in the range. exclude_range <- function(start, end) { character_class(p("^", character_class_escape(start), "-", character_class_escape(end))) } register(exclude_range) rex/R/rex-mode.R0000644000176200001440000000117112447542420013120 0ustar liggesusers#' Toggles \pkg{rex} mode. #' #' While within rex mode, functions used within the \code{\link{rex}} function #' are attached, so one can get e.g. auto-completion within editors. #' #' @export rex_mode <- function() { ## Enter rex mode if (!.rex$mode) { .rex$mode <- TRUE message("Rex functions and shortcuts attached!") ## We know what we're doing, so hide the R CMD check note suppressMessages( eval(call("attach", call("$", as.name(".rex"), as.name("env")))) ) } ## Exit rex mode else { message("Rex functions and shortcuts detached!") .rex$mode <- FALSE detach(".rex$env") } } rex/R/escape.R0000644000176200001440000000427512477367546012671 0ustar liggesusers#' @include utils.R NULL #' Escape characters for a regex #' #' @param x Object to escape. #' @export escape <- function(x) UseMethod("escape") #' @describeIn escape Objects are simply passed through unchanged. #' @export escape.regex <- function(x) x #' @describeIn escape Objects are surrounded by braces. #' @export escape.character_class <- function(x) { p("[", x, "]") } #' @describeIn escape Objects are properly escaped for regular expressions. #' @export escape.character <- function(x) { chars <- c("*", ".", "?", "^", "+", "$", "|", "(", ")", "[", "]", "{", "}", "\\") regex(sanitize(x, chars)) } #' @describeIn escape default escape coerces to character and escapes. #' @export escape.default <- function(x) { escape.character(as.character(x)) } #' @describeIn escape simply call escape on all elements of the list. #' @export escape.list <- function(x) { lapply(x, escape) } escape_dots <- function(...) { unlist(escape(eval(list(...)))) } #' Character class escapes #' @inheritParams escape #' @export character_class_escape <- function(x) UseMethod("character_class_escape") #' @describeIn character_class_escape objects are passed through unchanged. #' @export character_class_escape.regex <- function(x) x #' @describeIn character_class_escape objects are passed through unchanged. #' @export character_class_escape.character_class <- character_class_escape.regex #' @describeIn character_class_escape objects properly escaped for character classes. #' @export character_class_escape.character <- function(x) { regex(sanitize(x, c("-", "^", "[", "]", "\\"))) } #' @describeIn character_class_escape call \code{character_class_escape} on all elements of the list. #' @export character_class_escape.list <- function(x) { lapply(x, character_class_escape) } #' @describeIn character_class_escape coerce to \code{character} and \code{character_class_escape}. #' @export character_class_escape.default <- function(x) { character_class_escape.character(as.character(x)) } character_class_escape_dots <- function(...) { unlist(character_class_escape(eval(list(...)))) } sanitize <- function(x, chars) { gsub(paste0("([\\", paste0(collapse = "\\", chars), "])"), "\\\\\\1", x, perl = TRUE) } rex/R/counts.R0000644000176200001440000000230512414513632012710 0ustar liggesusers#' @include escape.R #' @include utils.R NULL #' Counts #' #' Functions to restrict a regex to a specific number #' @param x A regex pattern. #' @param n An integer number #' @param low An integer number for the lower limit. #' @param high An integer number for the upper limit. #' @inheritParams zero_or_more #' @family rex #' @name counts NULL #' @aliases n #' @describeIn counts \code{x} must occur exactly \code{n} times. n_times <- n <- function(x, n, type = c("greedy", "lazy", "possessive")) { add_type(p("(?:", p(escape(x)), "){", n, "}"), type) } register(n_times, n) #' @describeIn counts \code{x} must occur between \code{low} and \code{high} times. between <- function(x, low, high, type = c("greedy", "lazy", "possessive")) { add_type(p("(?:", p(escape(x)), "){", low, ",", high, "}"), type) } register(between) #' @describeIn counts \code{x} must occur at least \code{n} times. at_least <- function(x, n, type = c("greedy", "lazy", "possessive")) { add_type(between(x, n, ""), type) } register(at_least) #' @describeIn counts \code{x} must occur at most \code{n} times. at_most <- function(x, n, type = c("greedy", "lazy", "possessive")) { add_type(between(x, "", n), type) } register(at_most) rex/R/or.R0000644000176200001440000000106012416530471012014 0ustar liggesusers#' @include utils.R #' @include escape.R NULL #' Or #' #' The special binary function \code{\%or\%} can be used to specify a set #' of optional matches. #' #' @rdname or #' @usage x \%or\% y #' @param x A string. #' @param y A string. #' @family rex #' @inheritParams capture `%or%` <- function(x, y) { group(p(escape(x)), regex("|"), p(escape(y))) } register(`%or%`) #' describeIn or regular function can also be used, useful for more than 2 arguments. or <- function(...) { group(regex(paste0(collapse = "|", unlist(escape_dots(...))))) } register(or) rex/R/capture.R0000644000176200001440000000377112431464271013053 0ustar liggesusers#' @include escape.R #' @include utils.R NULL #' Create a capture group #' #' Used to save the matched value within the group for use later in the regular #' expression or to extract the values captured. Both named and unnamed groups #' can later be referenced using \code{\link{capture_group}}. #' #' @param name of the group. Unnamed capture groups are numbers starting at 1 #' in the order they appear in the regular expression. If two groups have the #' same name, the leftmost group is the used in any reference. #' @param ... \code{\link{shortcuts}}, R variables, text, or other \pkg{rex} #' functions. #' @family rex #' @aliases . #' @seealso \code{\link{group}} for grouping without capturing. Perl 5 Capture #' Groups \url{http://perldoc.perl.org/perlre.html#Capture-groups} #' @examples #' #' # Match paired quotation marks #' re <- rex( #' # first quotation mark #' capture(quotes), #' #' # match all non-matching quotation marks #' zero_or_more(except(capture_group(1))), #' #' # end quotation mark (matches first) #' capture_group(1) #' ) #' #' #named capture - don't match apples to oranges #' re <- rex( #' capture(name = "fruit", or("apple", "orange")), #' "=", #' capture_group("fruit") #' ) capture <- . <- function(..., name = NULL) { if(!is.null(name)) { name <- paste0("?<", name, ">") } p( "(", name, p(escape_dots(...)), ")" ) } register(capture, .) #' @rdname capture capture_group <- function(name) { p( "\\g{", name, "}" ) } register(capture_group) #' Create a grouped expression #' #' This is similar to \code{\link{capture}} except that it does not store the #' value of the group. Best used when you want to combine several parts #' together and do not reference or extract the grouped value later. #' @inheritParams capture #' @seealso \code{\link{capture}} for grouping with capturing. Perl 5 Extended #' Patterns \url{http://perldoc.perl.org/perlre.html#Extended-Patterns} #' @family rex group <- function(...) { p( "(?:", p(escape_dots(...)), ")" ) } register(group) rex/R/zzz.R0000644000176200001440000000055012621357670012242 0ustar liggesusers.onAttach <- function(lib, pkg) { # nolint if (!interactive() || stats::runif(1) > 0.1) return() packageStartupMessage("Welcome to rex, the friendly regular expression helper!\n", "Use 'rex_mode()' to toggle code completion for rex shortcuts and functions.") } .onLoad <- function(libname, pkgname) { # nolint register(`%>%`) } rex/R/wildcards.R0000644000176200001440000000331512441077654013364 0ustar liggesusers#' @include escape.R #' @include utils.R NULL #' Wildcards #' #' @inheritParams capture #' @param type the type of match to perform. #' #' There are three match types #' \enumerate{ #' \item \code{greedy}: match the longest string. This is the default matching type. #' \item \code{lazy}: match the shortest string. This matches the shortest string from the same anchor point, not necessarily the shortest global string. #' \item \code{possessive}: match and don't allow backtracking #' } #' @family rex #' @name wildcards NULL #' @describeIn wildcards match \code{...} zero or more times. zero_or_more <- function(..., type = c("greedy", "lazy", "possessive")) { add_type(p("(?:", p(escape_dots(...)), ")*"), type) } register(zero_or_more) #' @describeIn wildcards match \code{...} one or more times. one_or_more <- function(..., type = c("greedy", "lazy", "possessive")) { add_type(p("(?:", p(escape_dots(...)), ")+"), type) } register(one_or_more) #' @describeIn wildcards match \code{...} zero or one times. #' @aliases zero_or_one maybe <- zero_or_one <- function(..., type = c("greedy", "lazy", "possessive")) { p("(?:", p(escape_dots(...)), ")?") } register(maybe, zero_or_one) add_type <- function(x, type = c("greedy", "lazy", "possessive")) { type <- match.arg(type) switch(type, greedy = x, lazy = p(x, "?"), possessive = p(x, "+") ) } #' Do not match #' #' @inheritParams capture #' @inheritParams zero_or_more #' @family rex # This is slightly different than if_next_isn't because we want to match # anything that is not the search term as well not <- function(..., type = c("greedy", "lazy", "possessive")) { add_type(p("(?:(?!", escape_dots(...), ").)*"), type = type) } register(not) rex/R/match.R0000644000176200001440000001214013171426545012476 0ustar liggesusers#' Match function #' #' @param data character vector to match against #' @param pattern regular expression to use for matching #' @param global use global matching #' @param options regular expression options #' @param locations rather than returning the values of the matched (or #' captured) string, return a \code{data.frame} of the match locations in the #' string. #' @param ... options passed to regexpr or gregexpr #' @return if no captures, returns a logical vector the same length as the #' input character vector specifying if the relevant value matched or not. If #' there are captures in the regular expression, returns a \code{data.frame} with a #' column for each capture group. If \code{global} is \code{TRUE}, returns a #' list of \code{data.frame}s. #' @seealso \code{\link{regexp}} Section "Perl-like Regular Expressions" for a #' discussion of the supported options #' @examples #' string <- c("this is a", "test string") #' re_matches(string, rex("test")) # FALSE FALSE #' #' # named capture #' re_matches(string, rex(capture(alphas, name = "first_word"), space, #' capture(alphas, name = "second_word"))) #' # first_word second_word #' # 1 this is #' # 2 test string #' #' # capture returns NA when it fails to match #' re_matches(string, rex(capture("test"))) #' # 1 #' # 1 test #' # 2 #' @aliases matches m #' @export re_matches matches m re_matches <- matches <- m <- function(data, pattern, global = FALSE, options = NULL, locations = FALSE, ...) { pattern <- add_options(pattern, options) process_matches <- function(match, string) { if(no_capture(match)) { # if no capture and no location just return if the regex matched if(!locations) { return(match != -1L) } # else return a data frame of the start and end locations match[ match == -1L ] <- NA_integer_ starts <- match attributes(starts) <- NULL lengths <- attr(match, "match.length") ends <- starts + lengths - 1L return(data.frame(start = starts, end = ends)) } # if a capture return a data frame with the capture results for each string starts <- attr(match, "capture.start") lengths <- attr(match, "capture.length") ends <- starts + lengths - 1L not_matched <- starts == -1L strings <- substring(string, starts, ends) strings[not_matched] <- NA_character_ res <- matrix(ncol = ncol(starts), strings) nms <- auto_name(attr(match, "capture.names")) if (!locations) { colnames(res) <- nms return(as.data.frame(res, stringsAsFactors = FALSE, check.names = FALSE)) } starts[not_matched] <- NA_integer_ ends[not_matched] <- NA_integer_ indexes <- unlist(lapply(seq_len(ncol(res)), function(x) { seq(x, by = ncol(res), length.out = 3) })) full <- data.frame(res, starts, ends, stringsAsFactors = FALSE, check.names = FALSE)[, indexes, drop = FALSE] full_names <- unlist(Map(function(name) c(name, paste(sep=".", name, c("start", "end"))), nms, USE.NAMES=F)) colnames(full) <- full_names full } if(global %==% TRUE) { mapply(process_matches, gregexpr(pattern = pattern, data, perl = TRUE, ...), data, SIMPLIFY = FALSE) } else { process_matches(regexpr(pattern = pattern, data, perl = TRUE, ...), data) } } #' Substitute regular expressions in a string with another string. #' #' @param data character vector to substitute #' @param pattern regular expression to match #' @param replacement replacement text to use #' @param global substitute all occurrences #' @param options option flags #' @param ... options passed to sub or gsub #' @seealso \code{\link{regexp}} Section "Perl-like Regular Expressions" for a #' discussion of the supported options #' @examples #' string <- c("this is a Test", "string") #' re_substitutes(string, "test", "not a test", options = "insensitive") #' re_substitutes(string, "i", "x", global = TRUE) #' re_substitutes(string, "(test)", "not a \\1", options = "insensitive") #' @aliases substitutes s #' @export re_substitutes substitutes s re_substitutes <- substitutes <- s <- function(data, pattern, replacement, global = FALSE, options = NULL, ...) { pattern <- add_options(pattern, options) method <- if (isTRUE(global)) gsub else sub method(x = data, pattern = pattern, replacement = replacement, perl = TRUE, ...) } add_options <- function(pattern, options) { if (!is.null(options)) { options <- match_args(options, names(option_map)) p("(?", p(option_map[options]), ")", pattern) } else { pattern } } match_args <- function(arg, choices) { matches <- pmatch(arg, choices) if (any(is.na(matches))) { stop(gettextf("'arg' should be one of %s", paste(dQuote(choices), collapse = ", ")), domain = NA) } choices[matches] } option_map <- c( "insensitive" = "i", "multi-line" = "m", "single-line" = "s", "extended" = "x", "ungreedy" = "U" ) no_capture <- function(match) { is.null(attr(match, "capture.start", exact = TRUE)) } auto_name <- function(names) { missing <- names == "" if (all(!missing)) { return(names) } names[missing] <- seq_along(names)[missing] names } rex/R/lookarounds.R0000644000176200001440000000330412477367546013761 0ustar liggesusers#' @include escape.R #' @include utils.R NULL #' Lookarounds #' #' These functions provide an interface to perl lookarounds. #' #' Special binary functions are used to infer an ordering, since often you #' might wish to match a word / set of characters conditional on the start #' and end of that word. #' #' \itemize{ #' \item \code{\%if_next_is\%}: \code{TRUE} if x follows y #' \item \code{\%if_next_isnt\%}: \code{TRUE} if x does not follow y #' \item \code{\%if_prev_is\%}: \code{TRUE} if y comes before x #' \item \code{\%if_prev_isnt\%}: \code{TRUE} if y does not come before x #' } #' @param x A regex pattern. #' @param y A regex pattern. #' @name lookarounds #' @title Lookarounds #' @family rex #' @seealso Perl 5 Documentation \url{http://perldoc.perl.org/perlre.html#Extended-Patterns} #' @examples #' stopifnot(grepl(rex("crab" %if_next_is% "apple"), "crabapple", perl = TRUE)) #' stopifnot(grepl(rex("crab" %if_prev_is% "apple"), "applecrab", perl = TRUE)) #' stopifnot(grepl(rex(range("a", "e") %if_next_isnt% range("f", "g")), #' "ah", perl = TRUE)) #' stopifnot(grepl(rex(range("a", "e") %if_next_is% range("f", "i")), #' "ah", perl = TRUE)) NULL #' @rdname lookarounds `%if_next_is%` <- function(x, y) { p("(?:", escape(x), "(?=", escape(y), ")", ")") } register(`%if_next_is%`) #' @rdname lookarounds `%if_next_isnt%` <- function(x, y) { p("(?:", escape(x), "(?!", escape(y), ")", ")") } register(`%if_next_isnt%`) #' @rdname lookarounds `%if_prev_is%` <- function(x, y) { p("(?:", "(?<=", escape(y), ")", escape(x), ")") } register(`%if_prev_is%`) #' @rdname lookarounds `%if_prev_isnt%` <- function(x, y) { p("(?:", "(? %\VignetteIndexEntry{Server Log Parsing} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- Parsing server log files is a common task in server administration. [1](http://link.springer.com/article/10.1007/BF03325089),[2](http://stackoverflow.com/search?q=%22Apache+log%22) Historically R would not be well suited to this and it would be better performed using a scripting language such as perl. Rex, however, makes this easy to do and allows you to perform both the data cleaning and analysis in R! Common server logs consist of space separated fields. > 198.214.42.14 - - [21/Jul/1995:14:31:46 -0400] "GET /images/ HTTP/1.0" 200 17688 > lahal.ksc.nasa.gov - - [24/Jul/1995:12:42:40 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 The logs used in this vignette come from two months of all HTTP requests to the NASA Kennedy Space Center WWW server in Florida and are freely available for use. [3](http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.html) ```{r include = FALSE} library(rex) library(dplyr) library(knitr) library(ggplot2) ``` ```{r show.warnings=FALSE} parsed <- scan("NASA.txt", what = "character", sep = "\n") %>% re_matches( rex( # Get the time of the request "[", capture(name = "time", except_any_of("]") ), "]", space, double_quote, "GET", space, # Get the filetype of the request if requesting a file maybe( non_spaces, ".", capture(name = "filetype", except_some_of(space, ".", "?", double_quote) ) ) ) ) %>% mutate(filetype = tolower(filetype), time = as.POSIXct(time, format="%d/%b/%Y:%H:%M:%S %z")) ``` This gives us a nicely formatted data frame of the time and filetypes of the requests. ```{r echo = FALSE} kable(head(parsed, n = 10)) ``` We can also easily generate a histogram of the filetypes, or a plot of requests over time. ```{r FALSE, fig.show='hold', warning = FALSE, message = FALSE} ggplot(na.omit(parsed)) + stat_count(aes(x=filetype)) ggplot(na.omit(parsed)) + geom_histogram(aes(x=time)) + ggtitle("Requests over time") ``` rex/vignettes/stackoverflow.R0000644000176200001440000004002512670366101016077 0ustar liggesusers#' --- #' title: "Stackoverflow Usage Examples" #' author: "Jim Hester" #' date: "`r Sys.Date()`" #' output: rmarkdown::html_vignette #' vignette: > #' %\VignetteIndexEntry{Stackoverflow Usage Examples} #' %\VignetteEngine{knitr::rmarkdown} #' \usepackage[utf8]{inputenc} #' --- #+ cache=FALSE, include=FALSE knitr::opts_chunk$set(collapse = TRUE, comment = "#>") knitr::render_markdown(strict = TRUE) #' ### [http://stackoverflow.com/questions/27106552][] #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. x <- c("a=1", "b=3", "a=9", "c=2", "b=4", "a=2") #' First extract the names and values from the strings. library(rex) matches <- re_matches(x, rex( capture(name="name", letter), "=", capture(name="value", digit) )) matches #' Then tally the groups using `split()`. groups <- split(as.numeric(matches$value), matches$name) groups #' If we try to convert directly to a data.frame from `split()` the groups with #' fewer members will have their members recycled rather than `NA`, so instead #' explicitly fill with `NA`. largest_group <- max(sapply(groups, length)) largest_group groups <- lapply(groups, function(group) { if (length(group) < largest_group) { group[largest_group] <- NA } group }) groups #' Finally we can create the data.frame do.call("data.frame", groups) #' ### [http://stackoverflow.com/questions/14146362/][] ### #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. mystrings <- c("X2/D2/F4", "X10/D9/F4", "X3/D22/F4", "X9/D22/F9") library(rex) matches <- re_matches(mystrings, rex( "/", any, capture(name = "numbers", digits) ) ) as.numeric(matches$numbers) #' ### [http://stackoverflow.com/questions/8613237/][] ## #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. j <- "What kind of cheese isn't your cheese? (wonder) Nacho cheese! (groan) (Laugh)" library(rex) matches <- re_matches(j, rex( "(", capture(name = "text", except_any_of(")")), ")"), global = TRUE) matches #' ### [http://stackoverflow.com/questions/22976472][] #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. txt <- as.character("this is just a test! i'm not sure if this is O.K. or if it will work? who knows. regex is sorta new to me.. There are certain cases that I may not figure out?? sad! ^_^") re <- rex( capture(name = "first_letter", alnum), capture(name = "sentence", any_non_puncts, zero_or_more( group( punct %if_next_isnt% space, any_non_puncts ) ), maybe(punct) ) ) re_substitutes(txt, re, "\\U\\1\\E\\2", global = TRUE) #' ### [http://stackoverflow.com/questions/27172007][] #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. x <- data.frame( locationid = c( 1073744023, 1073744022, 1073744025, 1073744024, 1073744021, 1073744026 ), address = c( "525 East 68th Street, New York, NY 10065, USA", "270 Park Avenue, New York, NY 10017, USA", "Rockefeller Center, 50 Rockefeller Plaza, New York, NY 10020, USA", "1251 Avenue of the Americas, New York, NY 10020, USA", "1301 Avenue of the Americas, New York, NY 10019, USA", "44 West 45th Street, New York, NY 10036, USA" )) library(rex) sep <- rex(",", spaces) re <- rex( capture(name = "address", except_some_of(",") ), sep, capture(name = "city", except_some_of(",") ), sep, capture(name = "state", uppers ), spaces, capture(name = "zip", some_of(digit, "-") ), sep, capture(name = "country", something )) re_matches(x$address, re) #' ### [http://stackoverflow.com/questions/27155297/][] #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. library(rex) x <- c( "https://support.google.com/blogger/topic/12457 https://support.google.com/blogger/topic/12457. https://support.google.com/blogger/topic/12457] <> https://support.google.com/blogger/topic/12457, https://support.google.com/blogger/topic/12457), xxxxxxhttps://support.google.com/blogger/topic/12457),hhhththta") re <- rex( capture(name = "url", "https://support.google.com/blogger/topic/", digits )) re_matches(x, re, global = TRUE)[[1]] #' ### [http://stackoverflow.com/questions/27219421][] #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. tmp <- c("Little Street","A323", "Essex Road (A43)", "M43","Orange street","M4","B2045","New Street") library(rex) classify_road <- function(x) { res <- re_matches(x, rex( capture(name = "type", upper ), digit ) ) res$type[ is.na(res$type) ] <- "Minor" paste(res$type, "Road") } classify_road(tmp) #' ### [http://stackoverflow.com/questions/22247410][] #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. x <- "this is a multiline text some more test here before we get to the good stuff \\end{figure}" re <- rex("\\end{figure}") re_matches(x, re) regexpr(re, x, perl = TRUE) #' ### [http://stackoverflow.com/questions/23447261][] #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. x = structure(list(text = structure(c(4L, 6L, 1L, 2L, 5L, 3L), .Label = c("ãããæããããéãããæãããInappropriate announce:-(", "@AirAsia your direct debit (Maybank) payment gateways is not working. Is it something you are working to fix?", "@AirAsia Apart from the slight delay and shortage of food on our way back from Phuket, both flights were very smooth. Kudos :)", "RT @AirAsia: ØØÙØÙÙÙÙ ÙØØØ ØØØÙ ÙØØØØÙ ØØØØÙÙÙí í Now you can enjoy a #great :D breakfast onboard with our new breakfast meals! :D", "xdek ke flight @AirAsia Malaysia to LA... hahah..:p bagi la promo murah2 sikit, kompom aku beli...", "You know there is a problem when customer service asks you to wait for 103 minutes and your no is 42 in the queue. X-(" ), class = "factor"), created = structure(c(5L, 4L, 4L, 3L, 2L, 1L), .Label = c("1/2/2014 16:14", "1/2/2014 17:00", "3/2/2014 0:54", "3/2/2014 0:58", "3/2/2014 1:28"), class = "factor")), .Names = c("text", "created"), class = "data.frame", row.names = c(NA, -6L)) emots <- as.character(outer(c(":", ";", ":-", ";-"), c(")", "(", "]", "[", "D", "o", "O", "P", "p"), paste0)) re_matches(x$text, rex( capture(name = "emoticons", or(emots) ) ), global = T) #' ### [http://stackoverflow.com/questions/27234040][] #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. z <- "
MESA HIGH VICTORIES
Team Score
Parkfield High Demons 28 to 21
Burns High Badgers 14 to 13
" re_matches(z, rex( capture(name="table", " ### #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. df <- structure(list(Object = c("T00055", "T00055", "E00336", "E00336", "E00336", "E00336", "T 00054"), Coding = c("T 00055_005_<002_+", "T 00055_008_<002_+", "E 00336_041_<001_+001_+", "E 00336_041_<001_+001_+001_+", "E 00336_041_<001_+001_+002_+", "E 00336_041_<001_+001_+002_<", "T 00054_013_<003_<015_+003_<001_<"), Fn = c(2L, 2L, 3L, 4L, 4L, 4L, 4L), Remaining = c(30L, 30L, 0L, 10L, 56L, 52L, 52L)), .Names = c("Object", "Coding", "Fn", "Remaining"), row.names = c(NA, -7L), class = "data.frame") subset(df, grepl(rex(at_least(group("_+", anything), 2)), Coding)) #' ### #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. ids <- c("367025001", "CT_341796001", "M13X01692-01", "13C025050901", "13C00699551") re_substitutes(ids, rex(non_digits %or% list("01", end)), "", global = TRUE) #' ### #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. library("rvest") library("stringr") minimal <- html("blah

 foo") bodytext <- minimal %>% html_node("body") %>% html_text re_substitutes(bodytext, rex(spaces), "", global = TRUE) #' ### #+ message=FALSE string <- "this\\(system) {is} [full]." library(Hmisc) gsub("\\\\(.)", "\\1", escapeRegex(string)) #' Alternatively [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. library(rex) re_substitutes(escape(string), rex("\\", capture(any)), "\\1", global = TRUE) #' ### #' [rex](http://cran.r-project.org/web/packages/rex/) has a [vignette for parsing server logs](http://cran.r-project.org/web/packages/rex/vignettes/log_parsing.html). While the format is not exactly the same as your log you should be able to adapt it to your case fairly easily. #' As far as reading the log in assuming the file fits in memory your best bet is to read the whole file first with `readLines()`, then the following will put each field into a `data.frame` column. x <- "Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} \"GET /index.html HTTP/1.1\"" library(rex) re <- rex( capture(name = "process_name", alpha), "[", capture(name = "pid", digits), "]:", spaces, capture(name = "client_ip", any_of(digit, ".")), ":", capture(name = "client_port", digits), spaces, "[", capture(name = "accept_date", except_some_of("]")), "]", spaces, capture(name = "frontend_name", non_spaces), spaces, capture(name = "backend_name", except_some_of("/")), "/", capture(name = "server_name", non_spaces), spaces, capture(name = "Tq", some_of("-", digit)), "/", capture(name = "Tw", some_of("-", digit)), "/", capture(name = "Tc", some_of("-", digit)), "/", capture(name = "Tr", some_of("-", digit)), "/", capture(name = "Tt", some_of("+", digit)), spaces, capture(name = "status_code", digits), spaces, capture(name = "bytes_read", some_of("+", digit)), spaces, capture(name = "captured_request_cookie", non_spaces), spaces, capture(name = "captured_response_cookie", non_spaces), spaces, capture(name = "termination_state", non_spaces), spaces, capture(name = "actconn", digits), "/", capture(name = "feconn", digits), "/", capture(name = "beconn", digits), "/", capture(name = "srv_conn", digits), "/", capture(name = "retries", some_of("+", digit)), spaces, capture(name = "srv_queue", digits), "/", capture(name = "backend_queue", digits), spaces, "{", capture(name = "captured_request_headers", except_any_of("}")), "}", spaces, "{", capture(name = "captured_response_headers", except_any_of("}")), "}", spaces, double_quote, capture(name = "http_request", non_quotes), double_quote) re_matches(x, re) #' ### #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. my.data <- read.table(text = ' my.string state ......... A 1........ B 112...... C 11111.... D 1111113.. E 111111111 F 111111111 G ', header = TRUE, stringsAsFactors = FALSE) library(rex) re_matches(my.data$my.string, rex(capture(except(".")), "."))$'1' #' ### #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. string <- "Shakira - Wolf - 02.Hips don't lie.mp3" library(rex) re_matches(string, rex(capture(zero_or_more(any, type='lazy')), spaces, "-"))$'1' #' ### #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. string <- "I t is tim e to g o" library(rex) re_substitutes(string, rex( space %if_next_is% list( list(non_space, space, at_least(non_space, 2)) %or% list(non_space, end) ) ), "", global = TRUE) #' ### #' Using [rex](http://cran.r-project.org/web/packages/rex/index.html) may make this type of task a little simpler. string <- "01:04:43.064 [12439] <2> xyz 01:04:43.067 [12439] <2> a lmn 01:04:43.068 [12439] <4> j klm x_times_wait to <3000> 01:04:43.068 [12439] <4> j klm enter_object <5000> main k" library(rex) timestamp <- rex(n(digit, 2), ":", n(digit, 2), ":", n(digit, 2), ".", n(digit, 3)) re <- rex(timestamp, space, "[", digits, "]", space, "<", digits, ">", space, capture(anything)) re_matches(string, re, global = TRUE) rex/vignettes/NASA.txt0000644000176200001440000032335212670366101014355 0ustar liggesusers198.214.42.14 - - [21/Jul/1995:14:31:46 -0400] "GET /images/ HTTP/1.0" 200 17688 lahal.ksc.nasa.gov - - [24/Jul/1995:12:42:40 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 199.171.112.23 - - [02/Jul/1995:02:30:34 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 gate3.fmr.com - - [05/Jul/1995:13:51:39 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 curly02.slip.yorku.ca - - [10/Jul/1995:23:11:49 -0400] "GET /shuttle/missions/sts-70/sts-70-patch-small.gif HTTP/1.0" 200 5026 boson.epita.fr - - [15/Jul/1995:11:27:49 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-mir-dock.mpg HTTP/1.0" 200 946425 134.153.50.9 - - [13/Jul/1995:11:02:50 -0400] "GET /icons/text.xbm HTTP/1.0" 200 527 port00.ventura.rain.org - - [23/Jul/1995:09:11:06 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324 128.159.145.91 - - [14/Jul/1995:10:38:04 -0400] "GET /statistics/images/getstats_big.gif HTTP/1.0" 200 6777 slo.eei.upmc.edu - - [25/Jul/1995:09:33:01 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 206.13.med.umich.edu - - [14/Jul/1995:09:11:28 -0400] "GET /shuttle/resources/orbiters/challenger-logo.gif HTTP/1.0" 200 4179 xyplex4-1-7.ucs.indiana.edu - - [23/Jul/1995:13:12:39 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 193.67.232.218 - - [12/Jul/1995:10:57:18 -0400] "GET /shuttle/countdown/video/livevideo.gif HTTP/1.0" 200 77201 dd06-004.compuserve.com - - [14/Jul/1995:13:55:24 -0400] "GET / HTTP/1.0" 200 7071 splash.tss.com - - [25/Jul/1995:09:27:59 -0400] "GET /shuttle/technology/sts-newsref/stsref-toc.html HTTP/1.0" 200 65536 tassone.oro.net - - [14/Jul/1995:13:14:10 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509 pool2_13.odyssee.net - - [13/Jul/1995:10:09:31 -0400] "GET /news/nasa.nasamail.p/332 HTTP/1.0" 200 4584 ix-tam2-18.ix.netcom.com - - [16/Jul/1995:01:41:42 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 162.127.2.234 - - [20/Jul/1995:11:35:14 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 nsdux1.netsysdev.telerate.com - - [17/Jul/1995:09:08:28 -0400] "GET /history/history.html HTTP/1.0" 200 1602 panda.and.nl - - [25/Jul/1995:05:56:59 -0400] "GET /elv/elvpage.htm HTTP/1.0" 200 8594 cen13-100.centera.co.za - - [19/Jul/1995:07:59:37 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932 cad179.cadvision.com - - [26/Jul/1995:17:40:13 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 bill.ksc.nasa.gov - - [12/Jul/1995:06:15:59 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 fortmacr6.ccinet.ab.ca - - [05/Jul/1995:12:44:16 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 204.191.39.16 - - [08/Jul/1995:10:18:56 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 kuentos.guam.net - - [15/Jul/1995:19:03:32 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260 galactica.galactica.it - - [17/Jul/1995:16:15:46 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3345 pipe3.nyc.pipeline.com - - [17/Jul/1995:18:38:22 -0400] "GET /images/KSC-logosmall.gif" 200 1204 denali.ccs.neu.edu - - [04/Jul/1995:18:59:41 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-mir-dock-2.mpg HTTP/1.0" 200 835394 192.136.22.154 - - [10/Jul/1995:16:22:23 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630 p2077jdy.ksc.nasa.gov - - [10/Jul/1995:06:17:34 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 pm2_8.digital.net - - [19/Jul/1995:22:32:40 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 165.13.227.81 - - [24/Jul/1995:17:39:45 -0400] "GET /cgi-bin/imagemap/countdown70?279,282 HTTP/1.0" 302 85 www-a1.proxy.aol.com - - [26/Jul/1995:18:05:15 -0400] "GET /shuttle/missions/sts-71/movies/movies.html HTTP/1.0" 200 3381 mermaid19.cc.fukuoka-u.ac.jp - - [02/Jul/1995:21:01:56 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 ix-hay-ca1-24.ix.netcom.com - - [01/Jul/1995:00:44:25 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0912.gif HTTP/1.0" 200 48305 piweba4y.prodigy.com - - [07/Jul/1995:21:48:51 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 pm2-49.tvs.net - - [13/Jul/1995:11:09:40 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 131.95.116.54 - - [23/Jul/1995:13:49:41 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 nagoya102.infosphere.or.jp - - [07/Jul/1995:21:06:52 -0400] "GET / HTTP/1.0" 200 7067 floyd.msfc.nasa.gov - - [25/Jul/1995:11:55:46 -0400] "GET /shuttle/missions/sts-69/sts-69-patch-small.gif HTTP/1.0" 200 8083 siltb10.orl.mmc.com - - [14/Jul/1995:11:58:59 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 louise.acc.mcneese.edu - - [20/Jul/1995:12:18:38 -0400] "GET /images HTTP/1.0" 302 - leaf5.printronix.com - - [13/Jul/1995:11:21:11 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932 www-b5.proxy.aol.com - - [18/Jul/1995:22:49:22 -0400] "GET /shuttle/missions/sts-68/mission-sts-68.html HTTP/1.0" 304 0 piweba3y.prodigy.com - - [05/Jul/1995:11:34:49 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 38.12.1.10 - - [25/Jul/1995:15:14:20 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932 central.picker.com - - [04/Jul/1995:10:05:05 -0400] "GET /shuttle/countdown/lps/fr.gif HTTP/1.0" 200 30232 192.127.21.108 - - [17/Jul/1995:13:37:13 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 hpcvsop.cv.hp.com - - [27/Jul/1995:19:01:59 -0400] "GET /history/gemini/gemini.html HTTP/1.0" 200 2522 199.166.254.6 - - [25/Jul/1995:23:39:10 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0 basfegw.basf-corp.com - - [19/Jul/1995:15:44:44 -0400] "GET /shuttle/technology/sts-newsref/et.html HTTP/1.0" 200 20327 ip-pdx1-02.teleport.com - - [06/Jul/1995:08:22:09 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149 piweba2y.prodigy.com - - [07/Jul/1995:20:17:22 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 genesee.dama.tisc.titan.com - - [14/Jul/1995:11:50:14 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0" 200 14489 199-186.ico.att.net - - [13/Jul/1995:08:35:40 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 2600 mace2.out.trw.com - - [28/Jul/1995:12:50:04 -0400] "GET /history/apollo/apollo-13/apollo-13-info.html HTTP/1.0" 200 1583 slsyd1p08.ozemail.com.au - - [14/Jul/1995:01:19:31 -0400] "GET /ksc.html HTTP/1.0" 200 7071 sl03.chrysalis.org - - [28/Jul/1995:11:38:51 -0400] "GET /facilities/opf.html HTTP/1.0" 200 2355 132.146.209.157 - - [20/Jul/1995:04:42:25 -0400] "GET /shuttle/missions/51-l/sounds/ HTTP/1.0" 200 372 gemsgw.med.ge.com - - [07/Jul/1995:00:57:59 -0400] "GET /shuttle/missions/sts-1/images/81HC320.GIF HTTP/1.0" 200 90112 asbestos.cacd.rockwell.com - - [07/Jul/1995:14:25:38 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 gate.phillips.com - - [07/Jul/1995:13:09:45 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 304 0 dsingleton.tamu.edu - - [16/Jul/1995:17:11:00 -0400] "GET /shuttle/technology/images/et-lox_1-small.gif HTTP/1.0" 200 36098 fiscal-7.tamu.edu - - [10/Jul/1995:15:38:52 -0400] "GET /cgi-bin/imagemap/countdown70?361,126 HTTP/1.0" 302 97 bos1e.delphi.com - - [23/Jul/1995:16:23:10 -0400] "GET /shuttle/missions/sts-74/mission-sts-74.html HTTP/1.0" 200 3769 marina.cea.berkeley.edu - - [12/Jul/1995:15:03:14 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 134.193.59.1 - - [07/Jul/1995:20:33:13 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509 eliza.netaxis.com - - [04/Jul/1995:20:18:21 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 br11-4.niia.net - - [02/Jul/1995:23:09:47 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 304 0 ppp-nyc-3-12.ios.com - - [15/Jul/1995:22:39:27 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 jaguar.iis.varian.com - - [10/Jul/1995:14:51:15 -0400] "GET /history/apollo/apollo-13/sounds/a13_004.wav HTTP/1.0" 200 66764 nord.stat.umontreal.ca - - [15/Jul/1995:13:09:13 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 xterm9.labs.gmu.edu - - [23/Jul/1995:11:43:17 -0400] "GET /shuttle/missions/51-l/news HTTP/1.0" 302 - ariel.earth.nwu.edu - - [02/Jul/1995:18:24:52 -0400] "GET /history/apollo/apollo-11/images/69HC905.GIF HTTP/1.0" 200 109448 194.142.184.15 - - [06/Jul/1995:19:52:56 -0400] "GET /shuttle/resources/orbiters/columbia.html HTTP/1.0" 200 6922 dialup97-112.swipnet.se - - [03/Jul/1995:17:03:07 -0400] "GET / HTTP/1.0" 200 7074 163.205.23.110 - - [18/Jul/1995:11:04:33 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 mars.espn.com - - [27/Jul/1995:02:50:28 -0400] "GET /images/launchpalms.gif HTTP/1.0" 200 149114 vs1-ip.du.gtn.com - - [13/Jul/1995:15:35:13 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0950.jpg HTTP/1.0" 200 96064 lss1068.lss.emc.com - - [26/Jul/1995:09:44:37 -0400] "GET /shuttle/missions/sts-71/sts-71-day-03-highlights.html HTTP/1.0" 200 6210 dcn54.hns.com - - [06/Jul/1995:20:08:53 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-hand-shake.mpg HTTP/1.0" 200 372172 ix-kc4-28.ix.netcom.com - - [21/Jul/1995:00:43:56 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 rocky.lance.colostate.edu - - [25/Jul/1995:17:35:22 -0400] "GET /shuttle/countdown/countdown.html HTTP/1.0" 200 4324 141.211.127.165 - - [08/Jul/1995:13:54:12 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8678 148.61.102.19 - - [13/Jul/1995:09:28:04 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 fractal.mech.tohoku.ac.jp - - [26/Jul/1995:01:25:20 -0400] "GET /history/apollo/apollo-13/images/70HC314.GIF HTTP/1.0" 200 101267 siltb10.orl.mmc.com - - [20/Jul/1995:02:34:31 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 163.205.18.20 - - [12/Jul/1995:09:36:21 -0400] "GET /shuttle/missions/sts-70/sts-70-patch-small.gif HTTP/1.0" 200 5026 mica.saglac.qc.ca - - [02/Jul/1995:13:34:32 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3258 cbrc-a15.mgh.harvard.edu - - [14/Jul/1995:08:22:10 -0400] "GET /images/kscmap-tiny.gif HTTP/1.0" 200 2537 198.123.129.200 - - [21/Jul/1995:13:23:47 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3714 markoff.eng.fau.edu - - [24/Jul/1995:08:51:25 -0400] "GET /history/mercury/mr-3/mr-3.html HTTP/1.0" 200 1124 rogersj.ksc.nasa.gov - - [07/Jul/1995:11:02:27 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 auriga.db.erau.edu - - [11/Jul/1995:21:45:02 -0400] "GET /shuttle/missions/sts-8/sts-8-patch-small.gif HTTP/1.0" 200 16567 163.206.137.21 - - [24/Jul/1995:08:04:05 -0400] "HEAD /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 0 guardian.hermes.si - - [25/Jul/1995:07:14:07 -0400] "GET /history/apollo/apollo-1/apollo-1-patch-small.gif HTTP/1.0" 200 16979 wctc-cs-4.wctc.net - - [04/Jul/1995:01:05:28 -0400] "GET /history/apollo/apollo-13/sounds/a13_002.wav HTTP/1.0" 200 127045 ix-cin4-07.ix.netcom.com - - [11/Jul/1995:22:25:33 -0400] "GET /shuttle/missions/sts-70/images/images.html HTTP/1.0" 200 4048 central.picker.com - - [17/Jul/1995:16:00:50 -0400] "GET /elv/ATLAS_CENTAUR/atlas.gif HTTP/1.0" 200 2286 indy.gradient.com - - [11/Jul/1995:13:56:01 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3585 dal02-30.ppp.iadfw.net - - [19/Jul/1995:15:59:52 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 n1132651.ksc.nasa.gov - - [26/Jul/1995:11:23:22 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 koniecznylab.bio.purdue.edu - - [09/Jul/1995:20:53:49 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509 jobrien-ppp.clark.net - - [18/Jul/1995:00:59:59 -0400] "GET /shuttle/missions/sts-63/mission-sts-63.html HTTP/1.0" 304 0 bluu.demon.co.uk - - [02/Jul/1995:06:11:59 -0400] "GET /shuttle/technology/sts-newsref/sts_overview.html HTTP/1.0" 200 122880 128.104.235.243 - - [09/Jul/1995:20:41:32 -0400] "GET /elv/DELTA/delta.gif HTTP/1.0" 200 2244 itcpc6.cl.uh.edu - - [17/Jul/1995:21:24:45 -0400] "GET /shuttle/resources/orbiters/orbiters.html HTTP/1.0" 200 2178 ts34p7.netvision.net.il - - [01/Jul/1995:21:21:18 -0400] "GET / HTTP/1.0" 200 7074 147.74.34.254 - - [13/Jul/1995:09:56:16 -0400] "GET /shuttle/missions/sts-70/movies/woodpecker.mpg HTTP/1.0" 200 190269 194.72.149.130 - - [10/Jul/1995:12:45:33 -0400] "GET /shuttle/countdown/video/landing.gif HTTP/1.0" 304 0 www-c6.proxy.aol.com - - [22/Jul/1995:03:43:58 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 www-a2.proxy.aol.com - - [09/Jul/1995:12:58:15 -0400] "GET /history/history.html HTTP/1.0" 200 1602 pca21.worc.ac.uk - - [07/Jul/1995:03:40:09 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 emf1-203.emf.net - - [02/Jul/1995:16:29:35 -0400] "GET /cgi-bin/imagemap/countdown?376,272 HTTP/1.0" 302 68 swrl87.gina.slip.csu.net - - [26/Jul/1995:20:00:06 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509 access-1-11.rollanet.org - - [15/Jul/1995:01:49:50 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 4821 oac47.oac.utk.edu - - [19/Jul/1995:15:27:37 -0400] "GET /history/astp/astp-patch-small.gif HTTP/1.0" 200 18528 slip40.eafit.edu.co - - [03/Jul/1995:13:45:19 -0400] "GET /ksc.html HTTP/1.0" 304 0 edslink.eds.com - - [13/Jul/1995:10:49:13 -0400] "GET /shuttle/countdown/video/livevideo.gif HTTP/1.0" 200 16938 158.94.120.147 - - [26/Jul/1995:11:10:14 -0400] "GET /history/apollo/apollo-17/apollo-17-patch-small.gif HTTP/1.0" 200 14977 pebble-beach.newmedia.kri.com - - [27/Jul/1995:22:29:53 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0" 200 20226 ts3-44.upenn.edu - - [24/Jul/1995:22:33:36 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3714 192.67.113.95 - - [25/Jul/1995:15:51:04 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 orange.ge.com - - [19/Jul/1995:09:08:40 -0400] "GET /images/construct.gif HTTP/1.0" 200 1414 166.42.151.31 - - [07/Jul/1995:15:11:11 -0400] "GET /history/apollo/apollo-17/apollo-17-patch-small.gif HTTP/1.0" 200 14977 ugl8.ccs.itd.umich.edu - - [09/Jul/1995:20:41:51 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 199.90.90.22 - - [17/Jul/1995:12:55:40 -0400] "GET /htbin/wais.pl HTTP/1.0" 200 308 dial-1-1.dou.dk - - [10/Jul/1995:18:21:31 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260 ip042.phx.primenet.com - - [19/Jul/1995:06:40:11 -0400] "GET /shuttle/technology/sts-newsref/sts_mes.html HTTP/1.0" 200 139264 205.160.7.42 - - [23/Jul/1995:13:04:52 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 bobb.rapidramp.com - - [01/Jul/1995:03:03:45 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 alyssa.prodigy.com - - [05/Jul/1995:00:54:12 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 dialup97-112.swipnet.se - - [03/Jul/1995:17:08:06 -0400] "GET /icons/text.xbm HTTP/1.0" 200 527 ling.caen.gdeb.com - - [13/Jul/1995:09:51:23 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 304 0 198.62.98.38 - - [18/Jul/1995:10:38:42 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8678 ix-orl3-15.ix.netcom.com - - [01/Jul/1995:22:19:01 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509 sdn_b6_f02_ip.dny.rockwell.com - - [06/Jul/1995:14:05:23 -0400] "GET /images/lf-logo.gif HTTP/1.0" 404 - indy.gradient.com - - [12/Jul/1995:00:31:48 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3585 snowfox.fur.com - - [04/Jul/1995:02:55:03 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 ztivax.zfe.siemens.de - - [21/Jul/1995:10:21:50 -0400] "GET /history/apollo/apollo-11/images/ HTTP/1.0" 200 3459 163.185.27.107 - - [13/Jul/1995:09:47:13 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 rrzs8.rz.uni-regensburg.de - - [04/Jul/1995:07:22:19 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-launch-3.mpg HTTP/1.0" 200 49152 ping1.ping.be - - [01/Jul/1995:11:08:25 -0400] "GET /shuttle/missions/sts-64/sts-64-patch-small.gif HTTP/1.0" 200 15980 ix-dc9-06.ix.netcom.com - - [01/Jul/1995:20:09:19 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 ts34p7.netvision.net.il - - [01/Jul/1995:21:17:32 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 it.njit.edu - - [16/Jul/1995:13:56:41 -0400] "GET / HTTP/1.0" 200 7071 192.239.129.225 - - [03/Jul/1995:15:55:09 -0400] "GET /shuttle/countdown/lps/fr.html HTTP/1.0" 200 1879 dial043.mbnet.mb.ca - - [03/Jul/1995:15:26:39 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 ppp18.inst.com - - [19/Jul/1995:23:48:35 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 chi049.wwa.com - - [06/Jul/1995:02:14:02 -0400] "GET /htbin/wais.pl?STS-73 HTTP/1.0" 200 6698 pool3_9.odyssee.net - - [19/Jul/1995:16:39:51 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 304 0 ad11-062.compuserve.com - - [18/Jul/1995:13:41:48 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0" 200 14873 128.183.101.97 - - [21/Jul/1995:15:52:37 -0400] "GET /shuttle/missions/sts-69/sts-69-patch-small.gif HTTP/1.0" 200 8083 slip1149.rmii.com - - [25/Jul/1995:23:13:14 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324 unknown.nsp.be - - [24/Jul/1995:10:39:33 -0400] "GET /shuttle/missions/sts-70/images/DSC-95EC-0001.gif HTTP/1.0" 200 49152 dow1535-mac1.engin.umich.edu - - [25/Jul/1995:14:40:50 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677 163.205.150.14 - - [26/Jul/1995:08:12:11 -0400] "GET /elv/TITAN/titan.gif HTTP/1.0" 200 3530 pixart.wat.hookup.net - - [02/Jul/1995:22:47:50 -0400] "GET /images/construct.gif HTTP/1.0" 200 1414 z01742.iie.org.mx - - [10/Jul/1995:21:09:54 -0400] "GET /facilities/lc39a.html HTTP/1.0" 200 7008 dserpa.llnl.gov - - [10/Jul/1995:16:18:22 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 mica.saglac.qc.ca - - [02/Jul/1995:13:13:51 -0400] "GET /history/apollo/apollo-8/apollo-8-patch-small.gif HTTP/1.0" 200 11326 dal01-18.ppp.iadfw.net - - [24/Jul/1995:09:48:57 -0400] "GET /shuttle/resources/orbiters/enterprise.html HTTP/1.0" 200 9732 dial36.ppp.iastate.edu - - [03/Jul/1995:21:37:18 -0400] "GET /shuttle/missions/sts-69/ HTTP/1.0" 200 1725 cm.globalx.net - - [16/Jul/1995:23:18:35 -0400] "GET /history/apollo/apollo-7/apollo-7.html HTTP/1.0" 200 14136 news.ti.com - - [08/Jul/1995:12:18:16 -0400] "GET /history/apollo/apollo-13/movies/apo13launch.mpg HTTP/1.0" 200 402466 nt3.ksc.nasa.gov - - [09/Jul/1995:09:37:03 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 cedresk.nosc.mil - - [13/Jul/1995:14:21:09 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 163.205.162.112 - - [26/Jul/1995:15:03:05 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0915.jpg HTTP/1.0" 200 39654 ppp025.memphis.edu - - [14/Jul/1995:11:32:48 -0400] "GET /history/history.html HTTP/1.0" 200 1602 136.205.120.156 - - [26/Jul/1995:14:50:15 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 www-b1.proxy.aol.com - - [01/Jul/1995:17:59:52 -0400] "GET /shuttle/resources/orbiters/columbia.html HTTP/1.0" 200 6922 phoenix.csc.calpoly.edu - - [19/Jul/1995:02:09:52 -0400] "GET /shuttle/missions/sts-1/sts-1-patch-small.gif HTTP/1.0" 200 14176 ecad1.acdin.itt.com - - [26/Jul/1995:15:31:18 -0400] "GET /elv/uplink2.htm HTTP/1.0" 200 2031 n1032036.ksc.nasa.gov - - [25/Jul/1995:11:29:37 -0400] "GET /ksc.html HTTP/1.0" 200 7096 rulug6.leidenuniv.nl - - [12/Jul/1995:06:10:33 -0400] "GET /shuttle/technology/sts-newsref/stsref-toc.html HTTP/1.0" 200 84907 edams.ksc.nasa.gov - - [18/Jul/1995:11:14:15 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 167.116.60.153 - - [14/Jul/1995:08:54:56 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-0998.jpg HTTP/1.0" 200 75837 194.166.2.56 - - [12/Jul/1995:01:34:23 -0400] "GET /history/history.html HTTP/1.0" 200 1602 198.52.2.1 - - [17/Jul/1995:13:41:19 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18114 moat.bnr.co.uk - - [25/Jul/1995:09:04:18 -0400] "GET /images/shuttle-patch-small.gif HTTP/1.0" 200 4179 ix-tam3-18.ix.netcom.com - - [02/Jul/1995:19:34:09 -0400] "GET / HTTP/1.0" 200 7074 130.219.19.67 - - [02/Jul/1995:17:56:44 -0400] "GET /history/mercury/mr-3/mr-3.html HTTP/1.0" 200 1124 142.217.2.58 - - [10/Jul/1995:17:20:40 -0400] "GET /ksc.html HTTP/1.0" 200 7067 proxy0.research.att.com - - [11/Jul/1995:17:02:37 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0 piweba4y.prodigy.com - - [13/Jul/1995:10:45:06 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 n124.coco.community.net - - [08/Jul/1995:19:53:39 -0400] "GET /software/winvn/bluemarb.gif HTTP/1.0" 200 4441 dbettwy.sp.trw.com - - [05/Jul/1995:14:58:25 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677 e659229.boeing.com - - [25/Jul/1995:21:40:24 -0400] "GET /history/mercury/ma-6/ma-6-patch-small.gif HTTP/1.0" 200 21277 128.159.135.97 - - [07/Jul/1995:09:51:38 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 astrod.astr.tohoku.ac.jp - - [09/Jul/1995:00:37:43 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 dd07-022.compuserve.com - - [16/Jul/1995:22:16:46 -0400] "GET /history/apollo/apollo-13/docs/ HTTP/1.0" 200 377 usstyx.glaxo.com - - [07/Jul/1995:08:34:33 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3998 ix-rnwk1-24.ix.netcom.com - - [09/Jul/1995:01:24:21 -0400] "GET /shuttle/resources/orbiters/challenger.html HTTP/1.0" 200 8089 cad180.cadvision.com - - [05/Jul/1995:01:06:05 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 brass.vip.best.com - - [01/Jul/1995:18:08:09 -0400] "GET /cgi-bin/imagemap/countdown?96,175 HTTP/1.0" 302 110 dial-pl1-14.iway.aimnet.com - - [11/Jul/1995:00:32:07 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13374 ix-hou7-28.ix.netcom.com - - [02/Jul/1995:10:18:47 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 gatekeeper.mitre.org - - [07/Jul/1995:09:53:35 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 304 0 p25.boulder-2.dialup.csn.net - - [04/Jul/1995:13:13:04 -0400] "GET /images/lc39a-logo.gif HTTP/1.0" 200 13116 j13.ptl1.jaring.my - - [02/Jul/1995:06:38:26 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 worf.inhouse.compuserve.com - - [02/Jul/1995:14:01:28 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9867 ws10.lab04.wwu.edu - - [05/Jul/1995:13:25:40 -0400] "GET /shuttle/technology/sts-newsref/sts_overview.html HTTP/1.0" 200 209905 cja00031.slip.digex.net - - [05/Jul/1995:22:23:02 -0400] "GET /msfc/astro_home.html HTTP/1.0" 200 2938 nbeaud.hip.cam.org - - [15/Jul/1995:11:18:44 -0400] "GET /icons/text.xbm HTTP/1.0" 200 527 orleans-slip-b1.neosoft.com - - [13/Jul/1995:22:47:16 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 hp201601.usi.edu - - [13/Jul/1995:12:29:02 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 n1122106.ksc.nasa.gov - - [12/Jul/1995:12:49:02 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 nwi-pc-104.plk.af.mil - - [21/Jul/1995:11:16:26 -0400] "GET /icons/text.xbm HTTP/1.0" 200 527 dyn-357.direct.ca - - [09/Jul/1995:15:58:27 -0400] "GET /shuttle/missions/51-j/ HTTP/1.0" 200 1574 van05149.direct.ca - - [26/Jul/1995:12:33:12 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13450 149.168.150.46 - - [14/Jul/1995:19:47:53 -0400] "GET /history/mercury/mr-3/mr-3-patch-small.gif HTTP/1.0" 200 19084 s149.phxslip4.indirect.com - - [17/Jul/1995:00:13:37 -0400] "GET /shuttle/missions/sts-70/movies/woodpecker.mpg HTTP/1.0" 200 190269 cfd18.larc.nasa.gov - - [13/Jul/1995:10:48:24 -0400] "GET /shuttle/countdown/video/livevideo.gif HTTP/1.0" 200 67417 198.187.217.213 - - [04/Jul/1995:19:41:25 -0400] "GET /history/apollo/apollo-11/apollo-11.html HTTP/1.0" 200 41397 atropos.jf.intel.com - - [19/Jul/1995:15:38:07 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 163.205.12.100 - - [19/Jul/1995:14:07:55 -0400] "HEAD /images/NASA-logosmall.gif HTTP/1.0" 200 0 ehsmac.ehs.colostate.edu - - [08/Jul/1995:19:14:37 -0400] "GET /images/ HTTP/1.0" 200 17688 rb12.superlink.net - - [08/Jul/1995:01:12:18 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9867 130.181.6.17 - - [24/Jul/1995:11:42:39 -0400] "GET /shuttle/missions/sts-70/sts-70-day-01-highlights.html HTTP/1.0" 200 2832 disarray.demon.co.uk - - [01/Jul/1995:17:27:25 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 304 0 204.126.175.42 - - [10/Jul/1995:14:03:18 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-0622.gif HTTP/1.0" 200 32483 dialup149.tokyo.infoweb.or.jp - - [12/Jul/1995:05:24:45 -0400] "GET / HTTP/1.0" 200 7062 163.205.23.91 - - [13/Jul/1995:11:45:14 -0400] "GET /ksc.html HTTP/1.0" 200 7062 137.113.52.137 - - [19/Jul/1995:08:17:10 -0400] "GET /shuttle/resources/orbiters/atlantis.html HTTP/1.0" 200 7025 piweba4y.prodigy.com - - [12/Jul/1995:16:52:52 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3584 netcom15.netcom.com - - [13/Jul/1995:13:33:24 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 543 carolus.vhs.me.schwaben.de - - [01/Jul/1995:09:27:32 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 12040 shuttle.gsfc.nasa.gov - - [01/Jul/1995:17:25:56 -0400] "GET /history/apollo/as-202/as-202.html HTTP/1.0" 200 3121 fermi.concordia.ca - - [11/Jul/1995:14:04:47 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 rich-isdn.ngc.com - - [11/Jul/1995:01:54:48 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 ppp5.ucsfresno.edu - - [26/Jul/1995:18:10:40 -0400] "GET /facts/about_ksc.html HTTP/1.0" 200 3977 129.46.108.199 - - [07/Jul/1995:13:44:08 -0400] "GET /icons/text.xbm HTTP/1.0" 304 0 currypc.fpl.msstate.edu - - [22/Jul/1995:00:22:36 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3714 inspub_05.iee.org.uk - - [05/Jul/1995:16:39:23 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 synapse.umsmed.edu - - [09/Jul/1995:13:23:55 -0400] "GET /history/apollo/apollo-13/news/ HTTP/1.0" 200 377 grail412.nando.net - - [13/Jul/1995:20:55:24 -0400] "GET /shuttle/missions/51-l/mission-51-l.html HTTP/1.0" 200 6757 endeavor.fujitsu.co.jp - - [06/Jul/1995:08:02:42 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 derec - - [13/Jul/1995:07:29:34 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 752 drjo005a146.embratel.net.br - - [18/Jul/1995:00:08:43 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0951.gif HTTP/1.0" 200 29263 dialup-070.jbr.intellinet.com - - [09/Jul/1995:18:26:58 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 bootp-238-235.bootp.virginia.edu - - [24/Jul/1995:14:17:21 -0400] "GET /history/apollo/ HTTP/1.0" 200 6245 h132_197_8_121.gte.com - - [21/Jul/1995:17:28:17 -0400] "GET /shuttle/missions/sts-74/news/ HTTP/1.0" 200 374 n1121099.ksc.nasa.gov - - [17/Jul/1995:11:44:34 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 142.139.230.22 - - [27/Jul/1995:15:19:05 -0400] "GET /shuttle/technology/images/et-intertank_1-small.gif HTTP/1.0" 200 49152 lamar.d48.lilly.com - - [25/Jul/1995:15:23:02 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 graphics.fi.edu - - [11/Jul/1995:11:00:54 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 sreynold.ssc.nasa.gov - - [20/Jul/1995:11:24:45 -0400] "GET /shuttle/technology/images/sts_body_2-small.gif HTTP/1.0" 200 30067 crockett.gsfc.nasa.gov - - [20/Jul/1995:09:16:05 -0400] "GET /shuttle/resources/orbiters/columbia-logo.gif HTTP/1.0" 200 11417 ubu.colorado.edu - - [07/Jul/1995:22:13:25 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 sabre.net - - [05/Jul/1995:10:13:01 -0400] "GET /shuttle/missions/sts-1/sts-1-patch-small.gif HTTP/1.0" 200 14176 128.227.132.132 - - [12/Jul/1995:10:11:47 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3584 www-a1.proxy.aol.com - - [01/Jul/1995:07:04:40 -0400] "GET /images/landing-747.gif HTTP/1.0" 200 110875 199.17.2.12 - - [03/Jul/1995:11:12:11 -0400] "GET /shuttle/countdown/video/livevideo.gif HTTP/1.0" 200 0 163.206.162.80 - - [25/Jul/1995:15:15:29 -0400] "GET /shuttle/missions/sts-70/movies/movies.html HTTP/1.0" 200 2864 148.129.14.88 - - [05/Jul/1995:15:26:20 -0400] "GET /shuttle/missions/sts-70/sts-70-patch-small.gif HTTP/1.0" 200 5026 cie01.rivm.nl - - [19/Jul/1995:08:47:30 -0400] "GET /images/KSC-94EC-412-small.gif HTTP/1.0" 200 20484 edams.ksc.nasa.gov - - [12/Jul/1995:13:35:31 -0400] "GET /ksc.html HTTP/1.0" 200 7062 cedar1.lerc.nasa.gov - - [05/Jul/1995:15:23:00 -0400] "GET /elv/elvpage.htm HTTP/1.0" 200 7999 triton - - [24/Jul/1995:14:40:45 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3714 163.206.89.4 - - [20/Jul/1995:12:32:39 -0400] "GET /history/apollo/ HTTP/1.0" 200 6245 smoses.sp.trw.com - - [13/Jul/1995:13:18:57 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666 dpi-gw.ind.dpi.qld.gov.au - - [03/Jul/1995:19:43:05 -0400] "GET /cgi-bin/imagemap/countdown?259,271 HTTP/1.0" 302 85 ix-atl7-14.ix.netcom.com - - [04/Jul/1995:00:07:28 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 ix-pal-il2-18.ix.netcom.com - - [04/Jul/1995:10:38:59 -0400] "GET /shuttle/missions/sts-71/news HTTP/1.0" 302 - tetonf.aero.org - - [25/Jul/1995:10:27:40 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260 dgv.cr.usgs.gov - - [21/Jul/1995:15:09:09 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 reach.com - - [11/Jul/1995:17:35:15 -0400] "GET /shuttle/technology/sts-newsref/sts_mes.html HTTP/1.0" 200 175621 chaos.es.co.nz - - [18/Jul/1995:01:37:11 -0400] "GET /facilities/lc39a.html HTTP/1.0" 200 7008 daffy.cemax.com - - [18/Jul/1995:23:06:00 -0400] "GET /history/mercury/ma-9/ma-9-patch-small.gif HTTP/1.0" 200 21214 cap1.capaccess.org - - [07/Jul/1995:03:57:37 -0400] "GET /shuttle/countdown/lps/fr.html HTTP/1.0" 200 1879 ch251-22.ch.pdx.edu - - [06/Jul/1995:16:25:40 -0400] "GET /images/KSC-94EC-412-small.gif HTTP/1.0" 200 20484 bussell.iris.com - - [07/Jul/1995:11:06:12 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 drjo022a247.embratel.net.br - - [03/Jul/1995:10:28:09 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630 alf.jsc.nasa.gov - - [25/Jul/1995:17:56:23 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 71319 ix-ir15-26.ix.netcom.com - - [22/Jul/1995:15:45:49 -0400] "GET /history/mercury/mr-3/mr-3-patch.gif HTTP/1.0" 200 114688 pm2_3.digital.net - - [10/Jul/1995:20:29:27 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 lems21.lems.brown.edu - - [05/Jul/1995:19:38:42 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630 asd05-03.dial.xs4all.nl - - [11/Jul/1995:04:25:06 -0400] "GET /history/apollo/apollo-17/apollo-17-info.html HTTP/1.0" 200 1457 198.77.5.122 - - [10/Jul/1995:09:46:34 -0400] "GET /shuttle/missions/sts-70/news/ HTTP/1.0" 200 696 01-dynamic-c.wokingham.luna.net - - [10/Jul/1995:08:17:46 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 anc-p3-129.alaska.net - - [25/Jul/1995:16:18:58 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 acer.blm.gov - - [01/Jul/1995:23:38:29 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310 168.87.104.70 - - [26/Jul/1995:12:55:08 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0913.jpg HTTP/1.0" 200 25439 webgate1.mot.com - - [11/Jul/1995:13:36:11 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 bakerda-slip.usa.net - - [10/Jul/1995:01:21:28 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 304 0 141.246.44.7 - - [16/Jul/1995:13:15:55 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932 dialupline04.ghgcorp.com - - [19/Jul/1995:20:37:42 -0400] "GET /shuttle/resources/orbiters/endeavour.html HTTP/1.0" 200 6168 eul82.metronet.com - - [19/Jul/1995:00:37:05 -0400] "GET /images/shuttle-patch-small.gif HTTP/1.0" 200 4179 163.205.23.21 - - [21/Jul/1995:10:11:58 -0400] "GET /ksc.html HTTP/1.0" 200 7071 ppp147.aix.or.jp - - [13/Jul/1995:06:52:10 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8678 128.159.76.127 - - [06/Jul/1995:15:48:41 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 siltb10.orl.mmc.com - - [20/Jul/1995:03:09:34 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 147.151.1.168 - - [14/Jul/1995:11:15:38 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630 ts3-10.inforamp.net - - [01/Jul/1995:23:13:28 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0918.jpg HTTP/1.0" 200 46888 piweba1y.prodigy.com - - [02/Jul/1995:21:29:51 -0400] "GET /cgi-bin/imagemap/countdown?374,279 HTTP/1.0" 302 68 202.247.232.67 - - [14/Jul/1995:02:20:47 -0400] "GET /history/apollo/images/apollo-insignia.gif HTTP/1.0" 200 15121 163.206.137.21 - - [05/Jul/1995:12:15:25 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 4524 134.120.46.113 - - [21/Jul/1995:11:37:42 -0400] "GET /cgi-bin/imagemap/countdown70?396,288 HTTP/1.0" 302 68 163.205.18.20 - - [26/Jul/1995:06:34:02 -0400] "HEAD /images/NASA-logosmall.gif HTTP/1.0" 200 0 basfegw.basf-corp.com - - [19/Jul/1995:18:29:08 -0400] "GET /shuttle/resources/orbiters/columbia-logo.gif HTTP/1.0" 200 11417 piweba4y.prodigy.com - - [11/Jul/1995:12:05:12 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0" 200 13664 152.138.69.12 - - [26/Jul/1995:12:56:57 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 153.103.16.11 - - [10/Jul/1995:16:42:44 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-undocking.mpg HTTP/1.0" 200 726461 tty15-09.swipnet.se - - [23/Jul/1995:10:02:18 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 dialup17.afn.org - - [12/Jul/1995:08:33:12 -0400] "GET /ksc.html HTTP/1.0" 200 7062 128.149.100.245 - - [05/Jul/1995:23:28:13 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 itchy.raxco.com - - [13/Jul/1995:16:04:57 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 128.158.34.106 - - [12/Jul/1995:16:23:43 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 portmaster-ppp28.sut.ac.jp - - [21/Jul/1995:17:19:42 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 hephaestus.astro.lsa.umich.edu - - [26/Jul/1995:15:39:56 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 stratacom.strata.com - - [11/Jul/1995:15:05:55 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 128.220.116.211 - - [06/Jul/1995:17:54:44 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 gateway.cary.ibm.com - - [11/Jul/1995:08:25:07 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 piweba3y.prodigy.com - - [10/Jul/1995:22:13:50 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 triton.mmrc.ncsu.edu - - [07/Jul/1995:11:07:10 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3258 pm1_20.promedia.net - - [02/Jul/1995:03:26:38 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 143.91.179.3 - - [07/Jul/1995:17:33:15 -0400] "GET /shuttle/technology/sts-newsref/sts_asm.html HTTP/1.0" 200 71656 nb2ppp11.acns-slp.fsu.edu - - [07/Jul/1995:14:03:32 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0915.jpg HTTP/1.0" 200 39654 204.118.96.32 - - [24/Jul/1995:05:25:18 -0400] "GET /software/winvn/faq/WINVNFAQ-I-6.html HTTP/1.0" 200 1325 advantis.vnet.ibm.com - - [03/Jul/1995:21:17:17 -0400] "GET /shuttle/missions/sts-63/sts-63-info.html HTTP/1.0" 200 1431 129.252.210.26 - - [11/Jul/1995:15:19:12 -0400] "GET /history/apollo/apollo-13/sounds/a13_001.wav HTTP/1.0" 200 114688 192.86.22.98 - - [28/Jul/1995:12:39:31 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 igw.merck.com - - [24/Jul/1995:16:52:49 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 151.208.37.18 - - [18/Jul/1995:16:31:13 -0400] "GET /history/history.html HTTP/1.0" 200 1602 ariel.earth.nwu.edu - - [13/Jul/1995:12:18:24 -0400] "GET /history/apollo/apollo-16/apollo-16-patch-small.gif HTTP/1.0" 200 14897 134.57.49.122 - - [07/Jul/1995:17:30:04 -0400] "GET /ksc.html HTTP/1.0" 200 7067 n1043316.ksc.nasa.gov - - [18/Jul/1995:11:31:43 -0400] "GET /persons/astronauts/a-to-d/CrippenRL.txt HTTP/1.0" 200 6608 dialup-a11.netspace.net.au - - [03/Jul/1995:03:40:34 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 titsoc.soc.titech.ac.jp - - [10/Jul/1995:07:17:58 -0400] "GET /shuttle/resources/ HTTP/1.0" 200 723 128.163.196.12 - - [12/Jul/1995:10:41:02 -0400] "GET /shuttle/countdown/video/livevideo.gif HTTP/1.0" 200 77091 cs128-4.u.washington.edu - - [22/Jul/1995:02:58:41 -0400] "GET /history/apollo/apollo-13/sounds/a13_004.wav HTTP/1.0" 200 66764 lib100.c-lib.siu.edu - - [03/Jul/1995:12:26:22 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3258 dieron.lbl.gov - - [13/Jul/1995:18:48:30 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 jbbhome.gsfc.nasa.gov - - [20/Jul/1995:19:48:24 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 163.206.137.21 - - [18/Jul/1995:15:09:38 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 65576 134.57.49.93 - - [07/Jul/1995:09:48:25 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0 poppy.hensa.ac.uk - - [02/Jul/1995:14:21:42 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 194.166.12.28 - - [10/Jul/1995:12:13:02 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3585 reggae.iinet.net.au - - [08/Jul/1995:11:09:58 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8678 129.172.30.17 - - [07/Jul/1995:18:15:03 -0400] "GET /shuttle/missions/sts-77/news/ HTTP/1.0" 200 374 ppp4.usd.edu - - [24/Jul/1995:17:42:15 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8678 ana0014.deltanet.com - - [09/Jul/1995:03:07:08 -0400] "GET /pub/winvn/release.txt HTTP/1.0" 404 - eccr66-smart.colorado.edu - - [05/Jul/1995:22:32:34 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 192.132.213.125 - - [06/Jul/1995:13:49:38 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 www-a2.proxy.aol.com - - [24/Jul/1995:16:04:22 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 8529 ppp6.montrealnet.ca - - [28/Jul/1995:10:03:05 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527 ix-bir-al1-02.ix.netcom.com - - [16/Jul/1995:17:12:44 -0400] "GET /cgi-bin/imagemap/countdown70?67,151 HTTP/1.0" 302 111 dal08-14.ppp.iadfw.net - - [26/Jul/1995:01:06:30 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 304 0 selector.switch.bellcore.com - - [10/Jul/1995:14:29:52 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 192.239.129.52 - - [03/Jul/1995:12:58:53 -0400] "GET /images/launch-logo.gif HTTP/1.0" 304 0 jpene_pc.atk.com - - [07/Jul/1995:15:55:54 -0400] "GET /shuttle/missions/sts-71/movies/crew-arrival-t38.mpg HTTP/1.0" 200 305722 piweba4y.prodigy.com - - [16/Jul/1995:01:23:43 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 thunderbolt.nci.nih.gov - - [07/Jul/1995:10:48:41 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 ae069.du.pipex.com - - [04/Jul/1995:20:47:57 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677 ad13-089.compuserve.com - - [04/Jul/1995:17:24:10 -0400] "GET /shuttle/countdown/countdown.html HTTP/1.0" 200 3985 whanson.htc.honeywell.com - - [18/Jul/1995:14:33:28 -0400] "GET /cgi-bin/imagemap/countdown70?181,289 HTTP/1.0" 302 110 p5.denver1.dialup.csn.net - - [23/Jul/1995:20:30:06 -0400] "GET /software/winvn/wvsmall.gif HTTP/1.0" 200 13372 piweba4y.prodigy.com - - [16/Jul/1995:20:33:28 -0400] "GET /ksc.html HTTP/1.0" 200 7071 rush.internic.net - - [13/Jul/1995:02:28:13 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 752 130.99.144.82 - - [18/Jul/1995:12:16:49 -0400] "GET /images/shuttle-patch-logo.gif HTTP/1.0" 200 891 www-c5.proxy.aol.com - - [21/Jul/1995:14:08:26 -0400] "GET / HTTP/1.0" 200 7071 ppp-66-21.dialup.winternet.com - - [02/Jul/1995:22:05:42 -0400] "GET /history/apollo/apollo-13/apollo-13-info.html HTTP/1.0" 200 1583 199.16.15.28 - - [05/Jul/1995:10:37:15 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0443.jpg HTTP/1.0" 200 115599 alyssa.prodigy.com - - [10/Jul/1995:17:52:20 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4247 piweba1y.prodigy.com - - [14/Jul/1995:15:40:29 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 4142 larryd.ppp.intrnet.net - - [16/Jul/1995:12:24:02 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 165.189.59.101 - - [17/Jul/1995:10:56:56 -0400] "GET /images/crawler-logo.gif HTTP/1.0" 200 14108 mansell.gpsemi.com - - [20/Jul/1995:07:39:48 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 ppp26.moa.com - - [06/Jul/1995:00:36:53 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 user24.bnn-net.or.jp - - [21/Jul/1995:12:28:20 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 ganymede.execpc.com - - [08/Jul/1995:15:50:33 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 198.147.119.23 - - [20/Jul/1995:10:16:34 -0400] "GET / HTTP/1.0" 304 0 pool03-30.innet.be - - [01/Jul/1995:02:38:36 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310 eltanin.ksc.nasa.gov - - [12/Jul/1995:15:01:59 -0400] "GET /shuttle/missions/61-b/mission-61-b.html HTTP/1.0" 200 6570 appsrv2.rsa.hisd.harris.com - - [07/Jul/1995:16:24:12 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 n1028281.ksc.nasa.gov - - [05/Jul/1995:15:25:34 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 304 0 blackbird.snm.com - - [18/Jul/1995:18:43:57 -0400] "GET /history/apollo/as-201/as-201-patch-small.gif HTTP/1.0" 200 16184 lwbyppp18.epix.net - - [02/Jul/1995:23:06:44 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 304 0 enterprise.america.com - - [23/Jul/1995:21:28:59 -0400] "GET /ksc.html HTTP/1.0" 200 7071 160.129.65.73 - - [14/Jul/1995:13:11:25 -0400] "GET /shuttle/technology/sts-newsref/stsref-toc.html HTTP/1.0" 200 84907 ix-chi7-19.ix.netcom.com - - [16/Jul/1995:23:58:33 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 piweba3y.prodigy.com - - [21/Jul/1995:00:50:54 -0400] "GET /shuttle/missions/sts-70/sts-70-patch-small.gif HTTP/1.0" 200 5978 turnpike25.onramp.net - - [04/Jul/1995:13:33:17 -0400] "GET /images/shuttle-patch-logo.gif HTTP/1.0" 200 891 jprzy01-sl.cc.emory.edu - - [04/Jul/1995:15:45:37 -0400] "GET /shuttle/missions/sts-78/mission-sts-78.html HTTP/1.0" 200 4602 205.236.175.133 - - [26/Jul/1995:19:35:53 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324 dialup-2-162.gw.umn.edu - - [16/Jul/1995:16:34:39 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18114 bstfirewall.bst.bls.com - - [07/Jul/1995:15:46:45 -0400] "GET /shuttle/missions/ HTTP/1.0" 200 12283 indy.gradient.com - - [11/Jul/1995:19:30:39 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3584 ix-roc-il1-09.ix.netcom.com - - [04/Jul/1995:11:35:58 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 140.254.52.21 - - [11/Jul/1995:19:05:47 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 sbd0107.deltanet.com - - [24/Jul/1995:02:22:34 -0400] "GET /shuttle/missions/51-l/news HTTP/1.0" 302 - www.world.net - - [20/Jul/1995:11:00:38 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-1020.gif HTTP/1.0" 200 28567 193.116.1.4 - - [14/Jul/1995:09:47:14 -0400] "GET /mdss/dcy2.gif HTTP/1.0" 200 5679 ac180.du.pipex.com - - [25/Jul/1995:08:25:23 -0400] "GET /facilities/lc39a.html HTTP/1.0" 200 7008 dd10-002.compuserve.com - - [02/Jul/1995:00:26:07 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310 192.77.52.12 - - [06/Jul/1995:18:55:37 -0400] "GET /shuttle/missions/51-l/images/ HTTP/1.0" 200 1038 ix-li4-09.ix.netcom.com - - [14/Jul/1995:10:35:38 -0400] "GET /shuttle/missions/61-b/61-b-patch-small.gif HTTP/1.0" 200 12722 bbs127.svtlab.bls.com - - [17/Jul/1995:17:21:05 -0400] "GET /shuttle/missions/sts-71/news HTTP/1.0" 302 - 137.158.66.44 - - [13/Jul/1995:09:14:43 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149 128.159.122.197 - - [13/Jul/1995:07:16:02 -0400] "GET /finance/book.gif HTTP/1.0" 200 3203 gateway-.baylor.edu - - [19/Jul/1995:15:52:31 -0400] "GET /history/apollo/apollo-13/sounds/a13_003.wav HTTP/1.0" 200 6685 194.166.8.31 - - [25/Jul/1995:14:12:21 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 ad14-020.compuserve.com - - [12/Jul/1995:11:35:35 -0400] "GET /shuttle/missions/sts-68/ksc-srl-image.html HTTP/1.0" 200 1404 163.205.51.65 - - [12/Jul/1995:12:46:20 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 163.205.154.12 - - [14/Jul/1995:14:29:12 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 adm212-2.npub.ttu.edu - - [12/Jul/1995:15:04:43 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18114 ppp188-51.fla.net - - [04/Jul/1995:07:33:47 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 304 0 ppp-66-44.dialup.winternet.com - - [16/Jul/1995:20:22:44 -0400] "GET /history/apollo/apollo-4/apollo-4.html HTTP/1.0" 200 3543 stratacom.strata.com - - [11/Jul/1995:20:17:30 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 ppp204.scott.net - - [14/Jul/1995:22:21:54 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 pearl.ias.unt.edu - - [01/Jul/1995:12:51:34 -0400] "GET /shuttle/missions/sts-71/movies/movies.html HTTP/1.0" 200 3092 193.129.161.174 - - [17/Jul/1995:13:01:47 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 304 0 nnfin.tor.hookup.net - - [04/Jul/1995:13:17:56 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 drjo017a146.embratel.net.br - - [23/Jul/1995:11:25:51 -0400] "GET /icons/text.xbm HTTP/1.0" 200 527 datapc.bda.nasa.gov - - [14/Jul/1995:07:31:03 -0400] "GET /facilities/milapict.gif HTTP/1.0" 200 119441 sgigate.sgi.com - - [19/Jul/1995:20:34:05 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 163.205.130.2 - - [12/Jul/1995:11:30:32 -0400] "GET /ksc.html HTTP/1.0" 200 7062 ix-sf13-25.ix.netcom.com - - [10/Jul/1995:02:01:48 -0400] "GET /software/winvn/bluemarb.gif HTTP/1.0" 304 0 bdallen.larc.nasa.gov - - [11/Jul/1995:16:54:07 -0400] "GET /ksc.html HTTP/1.0" 200 7062 so.scsnet.com - - [22/Jul/1995:14:58:15 -0400] "GET /images/launch-logo.gif HTTP/1.0" 304 0 netport-17.iu.net - - [09/Jul/1995:10:59:31 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310 138.13.97.133 - - [27/Jul/1995:15:50:15 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677 192.32.212.5 - - [06/Jul/1995:22:08:06 -0400] "GET /history/apollo/apollo-1/ HTTP/1.0" 200 1731 erdpc-1.umtri.umich.edu - - [04/Jul/1995:18:35:57 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 204.177.198.111 - - [11/Jul/1995:19:23:57 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 48511 ad04-054.compuserve.com - - [02/Jul/1995:17:04:05 -0400] "GET /shuttle/missions/sts-68/mission-sts-68.html HTTP/1.0" 200 49087 ernie.prc.com - - [07/Jul/1995:12:45:54 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3998 128.159.165.108 - - [18/Jul/1995:09:11:59 -0400] "GET /whats-new.html HTTP/1.0" 200 17857 relay.dia.osis.gov - - [12/Jul/1995:12:18:55 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 cdcopus2.ulb.ac.be - - [11/Jul/1995:18:54:43 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 p5100.dsphere.com - - [06/Jul/1995:16:59:29 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 ix-cin4-07.ix.netcom.com - - [11/Jul/1995:22:21:07 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 192.32.212.5 - - [06/Jul/1995:20:21:08 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 jjames.sso.az.honeywell.com - - [14/Jul/1995:09:09:52 -0400] "GET /shuttle/countdown/images/countclock.gif HTTP/1.0" 200 13994 mikehogan.gsfc.nasa.gov - - [15/Jul/1995:02:29:44 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 edf3.edf.fr - - [07/Jul/1995:13:37:54 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 dd02-019.compuserve.com - - [23/Jul/1995:14:28:34 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 jrowland.ftest.gulfaero.com - - [13/Jul/1995:11:24:37 -0400] "GET /history/apollo/apollo-13/apollo-13-info.html HTTP/1.0" 200 1583 howieh.seanet.com - - [04/Jul/1995:09:51:49 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 ad08-031.compuserve.com - - [14/Jul/1995:23:29:41 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 4142 beaker12.ovl.osc.edu - - [13/Jul/1995:14:57:15 -0400] "GET /shuttle/missions/sts-70/news/ HTTP/1.0" 200 696 drjo005a138.embratel.net.br - - [11/Jul/1995:20:39:32 -0400] "GET /ksc.html HTTP/1.0" 200 7062 pm005-01.dialip.mich.net - - [20/Jul/1995:17:57:35 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 129.228.36.50 - - [06/Jul/1995:08:56:43 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 blazemonger.pc.cc.cmu.edu - - [11/Jul/1995:06:40:38 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3585 137.78.116.245 - - [22/Jul/1995:18:43:50 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556 pm1-29.magicnet.net - - [13/Jul/1995:18:06:21 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 pm1-28.abc.se - - [02/Jul/1995:08:00:09 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-tcdt-crew-walkout.mpg HTTP/1.0" 200 98304 193.10.114.87 - - [21/Jul/1995:13:23:08 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 sa1178.thenet.ch - - [10/Jul/1995:17:09:52 -0400] "GET /images/launch-small.gif HTTP/1.0" 200 3938 poppy.hensa.ac.uk - - [11/Jul/1995:06:00:00 -0400] "GET /shuttle/missions/sts-68/images/ksc-upclose.gif HTTP/1.0" 200 86984 128.159.76.73 - - [24/Jul/1995:14:31:20 -0400] "GET /htbin/wais.pl?CAPL HTTP/1.0" 200 2854 rummelplatz.uni-mannheim.de - - [02/Jul/1995:14:13:20 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 129.107.15.241 - - [11/Jul/1995:09:18:25 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 bib7.bc.edu - - [04/Jul/1995:17:02:50 -0400] "GET /shuttle/missions/61-a/61-a-patch-small.gif HTTP/1.0" 200 12711 204.5.238.72 - - [03/Jul/1995:13:45:51 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149 novix.casi.sti.nasa.gov - - [17/Jul/1995:13:31:48 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 s003n020.csun.edu - - [11/Jul/1995:18:14:00 -0400] "GET /shuttle/missions/sts-69/ HTTP/1.0" 200 1725 ix-sal-or1-02.ix.netcom.com - - [03/Jul/1995:00:10:08 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 scooter.pa-x.dec.com - - [01/Jul/1995:02:24:03 -0400] "GET /shuttle/countdown HTTP/1.0" 302 - geogtech.geog.uregina.ca - - [18/Jul/1995:12:02:44 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666 ad07-005.compuserve.com - - [16/Jul/1995:16:13:19 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 pl01266.ksc.nasa.gov - - [02/Jul/1995:06:19:46 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 www-b3.proxy.aol.com - - [21/Jul/1995:12:02:18 -0400] "GET /cgi-bin/imagemap/countdown70?177,293 HTTP/1.0" 302 110 ppp057-stdkn2.ulaval.ca - - [19/Jul/1995:13:14:42 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 linux2.kcc.edu - - [19/Jul/1995:16:12:05 -0400] "GET /shuttle/technology/sts-newsref/centers.html HTTP/1.0" 200 71022 134.71.170.32 - - [23/Jul/1995:14:41:38 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 163.205.18.49 - - [13/Jul/1995:08:20:53 -0400] "GET /shuttle/countdown HTTP/1.0" 302 - indy63.gclab.missouri.edu - - [10/Jul/1995:18:51:00 -0400] "GET /history/apollo/apollo-10/apollo-10.html HTTP/1.0" 200 3440 crc6-fddi.cris.com - - [15/Jul/1995:13:04:28 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 128.159.121.64 - - [09/Jul/1995:10:38:19 -0400] "GET /finance/ref_btn.gif HTTP/1.0" 200 2582 stealth.cal.sdl.usu.edu - - [12/Jul/1995:12:47:13 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 ws110.termserv.gordon.army.mil - - [12/Jul/1995:00:37:11 -0400] "GET /software/winvn/userguide/docsleft.gif HTTP/1.0" 304 0 slip7-18.fl.us.ibm.net - - [01/Jul/1995:14:55:56 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 136.205.12.204 - - [26/Jul/1995:18:50:11 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3714 pool040.max1.ffx1.va.dynip.alter.net - - [25/Jul/1995:16:30:17 -0400] "GET /procurement/midrange/rfo/fiberrfo.txt HTTP/1.0" 200 41171 client-71-160.online.apple.com - - [19/Jul/1995:13:25:59 -0400] "GET /shuttle/missions/sts-72/mission-sts-72.html HTTP/1.0" 200 3807 kip-1-sn-380.dartmouth.edu - - [07/Jul/1995:15:32:55 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527 ip219.msp.primenet.com - - [05/Jul/1995:19:50:53 -0400] "GET /elv/PEGASUS/pegdesc.htm HTTP/1.0" 200 2881 redfish.atmos.colostate.edu - - [23/Jul/1995:14:50:05 -0400] "GET /elv/TITAN/mars2s.jpg HTTP/1.0" 200 1549 ix-la17-13.ix.netcom.com - - [01/Jul/1995:23:43:04 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 128.39.87.113 - - [06/Jul/1995:03:25:48 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 ka122053.ksc.nasa.gov - - [07/Jul/1995:12:11:05 -0400] "GET /finance/ref_btn.gif HTTP/1.0" 200 2582 reliant.nosc.mil - - [26/Jul/1995:18:07:34 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509 199.227.1.130 - - [25/Jul/1995:16:50:42 -0400] "GET /software/winvn/winvn.gif HTTP/1.0" 200 25218 metabelis.rmit.edu.au - - [11/Jul/1995:22:52:33 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 bianca.osc.on.ca - - [23/Jul/1995:12:48:01 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 ix-wpb-fl1-06.ix.netcom.com - - [13/Jul/1995:09:11:54 -0400] "GET /shuttle/countdown/liftoff.html HTTP/1.0" 200 2600 mac6.vta.west.net - - [17/Jul/1995:21:30:20 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 ppp4.jax-inter.net - - [02/Jul/1995:19:31:09 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 129.228.232.125 - - [17/Jul/1995:12:04:01 -0400] "GET /cgi-bin/imagemap/countdown70?62,194 HTTP/1.0" 302 96 amalthea.lpl.arizona.edu - - [21/Jul/1995:19:06:28 -0400] "GET /htbin/wais.pl HTTP/1.0" 200 308 st-sid-rich-dyn-16.baylor.edu - - [17/Jul/1995:11:51:55 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 dialup92.azstarnet.com - - [20/Jul/1995:23:50:13 -0400] "GET /shuttle/missions/sts-77/mission-sts-77.html HTTP/1.0" 200 3065 audrey.sea.sikorsky.com - - [21/Jul/1995:06:22:25 -0400] "GET /shuttle/resources/orbiters/challenger-logo.gif HTTP/1.0" 200 4179 selene.pst.informatik.uni-muenchen.de - - [04/Jul/1995:07:05:05 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 rdhess.sp.trw.com - - [06/Jul/1995:19:30:53 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 focus.ftn.net - - [07/Jul/1995:19:46:29 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 n1043356.ksc.nasa.gov - - [07/Jul/1995:10:51:27 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 www-d1.proxy.aol.com - - [08/Jul/1995:21:17:15 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509 ip-pdx3-50.teleport.com - - [08/Jul/1995:05:43:21 -0400] "GET /images/crawler-logo.gif HTTP/1.0" 200 14108 ad14-036.compuserve.com - - [22/Jul/1995:03:15:59 -0400] "GET /htbin/wais.pl?51-L HTTP/1.0" 200 316 ft205.computek.net - - [12/Jul/1995:14:47:42 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149 vagrant.vf.mmc.com - - [26/Jul/1995:11:48:42 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 www-d2.proxy.aol.com - - [23/Jul/1995:20:21:09 -0400] "GET /shuttle/missions/sts-71/movies/movies.html HTTP/1.0" 200 3381 ip-longv1-22.teleport.com - - [08/Jul/1995:12:15:22 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 304 0 hp167.den.mmc.com - - [14/Jul/1995:10:45:30 -0400] "GET /elv/TITAN/titan.gif HTTP/1.0" 200 3530 piweba3y.prodigy.com - - [15/Jul/1995:17:27:38 -0400] "GET /shuttle/countdown/lps/fr.html HTTP/1.0" 200 1879 theforce.ccm.itesm.mx - - [26/Jul/1995:14:26:37 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 s-server.denso.co.jp - - [21/Jul/1995:07:36:12 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0 mac155.ma.psu.edu - - [13/Jul/1995:16:12:52 -0400] "GET /shuttle/countdown/video/livevideo.jpeg HTTP/1.0" 200 31547 edm-p3.supernet.ab.ca - - [17/Jul/1995:14:30:08 -0400] "GET /history/apollo/apollo-13/docs/ HTTP/1.0" 200 377 emerald.cybergate.com - - [14/Jul/1995:01:50:01 -0400] "GET /software/winvn/userguide/1_1.htm HTTP/1.0" 200 3650 147.148.145.64 - - [17/Jul/1995:07:40:04 -0400] "GET /elv/ATLAS_CENTAUR/atlas.gif HTTP/1.0" 200 2286 s19.ic.owatonna.mn.us - - [09/Jul/1995:18:54:03 -0400] "GET /images/shuttle-patch-small.gif HTTP/1.0" 200 4179 hydra.syr.edu - - [20/Jul/1995:21:34:31 -0400] "GET /images/whatsnew.gif HTTP/1.0" 200 651 130.135.47.128 - - [21/Jul/1995:08:55:10 -0400] "GET /cgi-bin/imagemap/countdown70?62,190 HTTP/1.0" 302 96 dialup06.av.ca.qnet.com - - [03/Jul/1995:11:52:55 -0400] "GET /shuttle/missions/sts-71/sts-71-patch.jpg HTTP/1.0" 200 49152 micro4.montefiore.ulg.ac.be - - [04/Jul/1995:05:25:56 -0400] "GET /htbin/wais.pl?STS-69 HTTP/1.0" 200 6373 dsouza.interlog.com - - [01/Jul/1995:12:37:40 -0400] "GET /history/apollo/apollo-13/movies/apo13inside.mpg HTTP/1.0" 200 501126 ppp4.globalone.net - - [23/Jul/1995:21:09:38 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 160.205.101.49 - - [24/Jul/1995:15:26:12 -0400] "GET /shuttle/technology/sts-newsref/srb.html HTTP/1.0" 200 49553 sbusol.rz.uni-sb.de - - [04/Jul/1995:08:29:13 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-rollout.mpg HTTP/1.0" 200 593699 piweba4y.prodigy.com - - [09/Jul/1995:21:34:33 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 hera.harvard.edu - - [21/Jul/1995:16:00:47 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 gw-eng.faxint.com - - [19/Jul/1995:18:11:56 -0400] "GET /shuttle/resources/orbiters/columbia.html HTTP/1.0" 200 6922 webgate1.mot.com - - [08/Jul/1995:16:06:57 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 140.171.18.158 - - [10/Jul/1995:08:57:43 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 dialup777.washington.mci.net - - [23/Jul/1995:17:32:44 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 130.45.35.75 - - [07/Jul/1995:13:06:25 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677 eve-1i.adam.com.au - - [14/Jul/1995:06:33:22 -0400] "GET /shuttle/countdown/video/livevideo.jpeg HTTP/1.0" 200 26308 128.206.99.211 - - [25/Jul/1995:20:02:13 -0400] "GET /history/gemini/gemini-vii/gemini-vii.html HTTP/1.0" 200 2473 ds7001-10.gnofn.org - - [08/Jul/1995:02:06:40 -0400] "GET /shuttle/missions/sts-67/images/KSC-95EC-0392.jpg HTTP/1.0" 200 104278 port-2-pharmacylr.pharm.arizona.edu - - [22/Jul/1995:15:59:42 -0400] "GET /history/apollo/apollo-17/apollo-17.html HTTP/1.0" 200 2732 204.149.226.79 - - [12/Jul/1995:10:37:40 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527 m35929.ksc.nasa.gov - - [20/Jul/1995:14:09:47 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 castlexx.demon.co.uk - - [06/Jul/1995:12:56:19 -0400] "GET /shuttle/missions/sts-72/images/ HTTP/1.0" 200 378 ts83.termserv.gordon.army.mil - - [19/Jul/1995:19:29:26 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13387 irpslab18.ucsd.edu - - [08/Jul/1995:00:44:17 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 gn2.getnet.com - - [22/Jul/1995:21:36:09 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 204.182.239.21 - - [23/Jul/1995:04:22:33 -0400] "GET /msfc/onboard/colorbar.gif HTTP/1.0" 200 796 gw.svskt.se - - [17/Jul/1995:05:29:50 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 maui36.maui.net - - [02/Jul/1995:00:30:30 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 siltb10.orl.mmc.com - - [15/Jul/1995:17:12:08 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 131.182.174.40 - - [20/Jul/1995:15:06:42 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 fiscal-7.tamu.edu - - [10/Jul/1995:09:26:19 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0913.gif HTTP/1.0" 200 21957 www-b3.proxy.aol.com - - [04/Jul/1995:02:55:42 -0400] "GET /history/apollo/as-201/news/ HTTP/1.0" 200 368 gw1.att.com - - [25/Jul/1995:06:47:08 -0400] "GET /ksc.html HTTP/1.0" 200 7096 192.68.108.59 - - [14/Jul/1995:10:03:40 -0400] "GET /images/faq.gif HTTP/1.0" 200 263 155.76.35.114 - - [19/Jul/1995:09:16:13 -0400] "GET /shuttle/missions/sts-70/images/images.html HTTP/1.0" 200 7225 ppp-ftl2-23.shadow.net - - [25/Jul/1995:16:48:09 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 future.dreamscape.com - - [06/Jul/1995:09:20:07 -0400] "GET /software/winvn/bluemarb.gif HTTP/1.0" 200 4441 bill.ksc.nasa.gov - - [13/Jul/1995:10:49:22 -0400] "GET /shuttle/countdown/video/livevideo.jpeg HTTP/1.0" 304 0 pong.ping.at - - [25/Jul/1995:17:23:54 -0400] "GET /msfc/other.html HTTP/1.0" 200 1193 usr10-dialup13.atlanta.mci.net - - [15/Jul/1995:02:17:51 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18114 inet1.nsc.com - - [24/Jul/1995:15:46:48 -0400] "GET / HTTP/1.0" 200 7071 194.166.2.33 - - [26/Jul/1995:06:54:23 -0400] "GET /software/winvn/wvsmall.gif HTTP/1.0" 200 13372 ix-sr3-05.ix.netcom.com - - [01/Jul/1995:20:39:32 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 128.187.11.91 - - [19/Jul/1995:14:52:52 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324 pc11.new-horizons.com - - [13/Jul/1995:14:33:53 -0400] "GET /shuttle/missions/sts-66/sts-66-patch-small.gif HTTP/1.0" 200 20271 bht8376.dukepower.com - - [21/Jul/1995:07:41:41 -0400] "GET / HTTP/1.0" 200 7071 ip11.iac.net - - [08/Jul/1995:16:28:22 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 304 0 d11.inxpress.net - - [10/Jul/1995:17:04:15 -0400] "GET /shuttle/missions/sts-70/movies/movies.html HTTP/1.0" 200 1136 128.158.44.12 - - [05/Jul/1995:10:03:08 -0400] "GET /shuttle/missions/sts-56/sts-56-patch-small.gif HTTP/1.0" 200 9978 alexh.cts.com - - [26/Jul/1995:00:42:12 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677 128.95.74.37 - - [03/Jul/1995:20:50:54 -0400] "GET /history/astp/flight-summary.txt HTTP/1.0" 200 509 goes-f.gsfc.nasa.gov - - [27/Jul/1995:17:31:15 -0400] "GET /shuttle/technology/sts-newsref/sts_mes.html HTTP/1.0" 200 175619 dd07-062.compuserve.com - - [17/Jul/1995:13:35:45 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 4821 165.2.141.5 - - [25/Jul/1995:15:00:07 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 slip2-74.acs.ohio-state.edu - - [26/Jul/1995:19:53:42 -0400] "GET /history/apollo/flight-summary.txt HTTP/1.0" 200 5086 131.110.52.165 - - [12/Jul/1995:15:16:06 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 304 0 pm2d27.iaehv.nl - - [03/Jul/1995:16:38:25 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310 pm1d10.iaehv.nl - - [01/Jul/1995:19:50:27 -0400] "GET /shuttle/missions/sts-78/mission-sts-78.html HTTP/1.0" 200 4378 query2.lycos.cs.cmu.edu - - [24/Jul/1995:15:12:08 -0400] "GET /shuttle/missions/sts-66/mission-sts-66.html HTTP/1.0" 200 174016 www-a2.proxy.aol.com - - [20/Jul/1995:19:59:22 -0400] "GET /shuttle/countdown/countdown70.html HTTP/1.0" 200 4247 hunter.ecs.soton.ac.uk - - [03/Jul/1995:12:47:35 -0400] "GET /shuttle/missions/sts-74/sts-74-patch-small.gif HTTP/1.0" 200 4179 barque.mdcorp.ksc.nasa.gov - - [13/Jul/1995:12:31:32 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 pm2_15.digital.net - - [19/Jul/1995:16:07:04 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 163.205.121.3 - - [13/Jul/1995:12:55:30 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 sahp315.sandia.gov - - [13/Jul/1995:14:21:17 -0400] "GET / HTTP/1.0" 200 7062 bolo.ecn.uoknor.edu - - [20/Jul/1995:16:06:21 -0400] "GET /htbin/wais.pl?IMAX HTTP/1.0" 200 6789 pc3.orbital.fr - - [06/Jul/1995:08:01:38 -0400] "GET /shuttle/missions/sts-71/movies/crew-arrival-t38.mpg HTTP/1.0" 200 305722 apocalypse.ksc.nasa.gov - - [28/Jul/1995:08:22:04 -0400] "GET / HTTP/1.0" 200 7280 pc111.pi.csiro.au - - [16/Jul/1995:18:22:52 -0400] "GET /shuttle/technology/images/sts_body_2-small.gif HTTP/1.0" 200 30067 damedici.ksc.nasa.gov - - [06/Jul/1995:10:38:56 -0400] "GET / HTTP/1.0" 200 7067 205.199.118.143 - - [24/Jul/1995:10:08:32 -0400] "GET /software/winvn/winvn.gif HTTP/1.0" 200 25218 axp2.cns.ox.ac.uk - - [05/Jul/1995:13:33:11 -0400] "GET /shuttle/missions/sts-71/sts-71-crew.gif HTTP/1.0" 200 311519 202.32.65.67 - - [25/Jul/1995:20:19:56 -0400] "GET /shuttle/missions/sts-70/sts-70-day-08-highlights.html HTTP/1.0" 200 4399 204.30.39.145 - - [17/Jul/1995:12:54:22 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 news.ti.com - - [19/Jul/1995:18:36:38 -0400] "GET /htbin/wais.pl?orbital+elements HTTP/1.0" 200 8271 204.191.101.13 - - [21/Jul/1995:17:26:59 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0 ad06-010.compuserve.com - - [04/Jul/1995:06:59:59 -0400] "GET /shuttle/resources/orbiters/atlantis-logo.gif HTTP/1.0" 200 4179 163.206.89.4 - - [14/Jul/1995:14:51:52 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-1015.gif HTTP/1.0" 200 55442 199.22.2.33 - - [13/Jul/1995:09:17:11 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 zyra.sdsu.edu - - [13/Jul/1995:15:49:30 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 tarragon.cambridge.scr.slb.com - - [12/Jul/1995:10:07:20 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509 nesnet.ne.nrcs.usda.gov - - [17/Jul/1995:10:40:42 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 p2251.acq.osd.mil - - [17/Jul/1995:10:42:52 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 parkins.hds.wsu.edu - - [06/Jul/1995:19:52:25 -0400] "GET /cgi-bin/imagemap/countdown?109,213 HTTP/1.0" 302 95 dns.modena.it - - [01/Jul/1995:05:53:25 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 l304hp11.tutech.fi - - [05/Jul/1995:03:24:44 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677 www-b3.proxy.aol.com - - [02/Jul/1995:12:56:08 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527 n1032824.ksc.nasa.gov - - [14/Jul/1995:15:06:44 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 poppy.hensa.ac.uk - - [28/Jul/1995:10:58:35 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 160.205.122.31 - - [14/Jul/1995:16:26:45 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0 161.187.78.21 - - [07/Jul/1995:12:40:36 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 lab39.cs.purdue.edu - - [05/Jul/1995:21:52:53 -0400] "GET /shuttle/missions/sts-78/mission-sts-78.html HTTP/1.0" 200 4604 132.148.56.118 - - [10/Jul/1995:22:21:36 -0400] "GET /history/skylab/skylab.html HTTP/1.0" 200 1687 central.picker.com - - [17/Jul/1995:16:11:37 -0400] "GET /elv/ATLAS_CENTAUR/atlas.gif HTTP/1.0" 200 2286 user105x70.foshay.lalc.k12.ca.us - - [19/Jul/1995:13:05:13 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 pppa003.compuserve.com - - [08/Jul/1995:03:35:03 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8678 198.209.8.20 - - [15/Jul/1995:00:21:29 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509 sunws4.galley.geog.ship.edu - - [05/Jul/1995:14:49:16 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 slip168-204.sy.au.ibm.net - - [13/Jul/1995:07:33:34 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3585 tiber.gsfc.nasa.gov - - [05/Jul/1995:09:12:47 -0400] "GET /shuttle/missions/sts-73/sts-73-patch-small.gif HTTP/1.0" 200 4179 193.1.142.148 - - [06/Jul/1995:15:14:47 -0400] "GET /shuttle/resources/orbiters/atlantis.html HTTP/1.0" 200 7025 134.241.27.74 - - [10/Jul/1995:09:47:06 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0906.jpg HTTP/1.0" 200 58414 bettong.client.uq.oz.au - - [05/Jul/1995:08:41:27 -0400] "GET /ksc.html HTTP/1.0" 200 7074 clrc.ca.gov - - [09/Jul/1995:00:31:17 -0400] "GET /images/rollback.gif HTTP/1.0" 200 52516 129.188.154.200 - - [05/Jul/1995:13:15:13 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 304 0 pm4_3.digital.net - - [19/Jul/1995:23:41:23 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 gfedor.lerc.nasa.gov - - [13/Jul/1995:16:27:15 -0400] "GET /images/lc39a-logo.gif HTTP/1.0" 200 13116 carmen.broder.com - - [10/Jul/1995:19:55:54 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 scooter.pharm.nwu.edu - - [27/Jul/1995:00:36:56 -0400] "GET /history/gemini/gemini-4/gemini-4.html HTTP/1.0" 200 3239 sutr.novalink.com - - [02/Jul/1995:17:55:20 -0400] "GET /history/apollo/apollo-spacecraft.txt HTTP/1.0" 200 2261 ppp45.asahi-net.or.jp - - [11/Jul/1995:09:49:34 -0400] "GET /history/apollo/apollo-11/apollo-11.html HTTP/1.0" 200 41397 advantis.vnet.ibm.com - - [05/Jul/1995:14:02:54 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310 128.159.177.114 - - [21/Jul/1995:08:39:38 -0400] "GET /ksc.html HTTP/1.0" 200 7071 n1-20-244.macip.drexel.edu - - [03/Jul/1995:17:25:24 -0400] "GET /cgi-bin/imagemap/countdown?107,213 HTTP/1.0" 302 95 line115.worldweb.net - - [08/Jul/1995:02:09:05 -0400] "GET /software/winvn/faq/WINVNFAQ-Contents.html HTTP/1.0" 200 3626 z005.euronet.nl - - [15/Jul/1995:12:11:02 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 relay.urz.uni-heidelberg.de - - [27/Jul/1995:10:38:41 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 163.205.130.3 - - [11/Jul/1995:10:11:24 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 jgonzalez.chntly.trw.com - - [13/Jul/1995:10:20:40 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 4823 shardegr.extern.ucsd.edu - - [07/Jul/1995:13:55:14 -0400] "GET /shuttle/countdown/countdown.html HTTP/1.0" 200 3998 cl2.nit.ac.jp - - [15/Jul/1995:05:40:58 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 130.99.153.120 - - [06/Jul/1995:13:59:36 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 iprock.tor.hookup.net - - [04/Jul/1995:17:33:02 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0873.gif HTTP/1.0" 200 47245 n1031626.ksc.nasa.gov - - [07/Jul/1995:16:00:30 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 comserv-e-40.usc.edu - - [14/Jul/1995:07:14:33 -0400] "GET /shuttle/missions/sts-70/images/images.html HTTP/1.0" 200 5167 hplvopen.lvld.hp.com - - [13/Jul/1995:14:29:39 -0400] "GET /shuttle/countdown/lps/fr.html HTTP/1.0" 200 1879 128.158.53.217 - - [17/Jul/1995:10:11:39 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 ix-hou6-21.ix.netcom.com - - [16/Jul/1995:18:17:38 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 slipper12338.iaccess.za - - [14/Jul/1995:14:55:26 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3345 192.152.98.125 - - [05/Jul/1995:05:51:17 -0400] "GET /shuttle/missions/sts-31/mission-sts-31.html HTTP/1.0" 200 6366 cd-11.continuum.net - - [23/Jul/1995:21:49:30 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 gatekeeper.mitre.org - - [07/Jul/1995:12:50:06 -0400] "GET /shuttle/missions/51-l/51-l-patch-small.gif HTTP/1.0" 200 10495 slip1.fs.cei.net - - [03/Jul/1995:15:24:50 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 asbestos.cacd.rockwell.com - - [11/Jul/1995:13:20:37 -0400] "GET /htbin/wais.pl?STS-71 HTTP/1.0" 200 4745 n1373371.ksc.nasa.gov - - [10/Jul/1995:11:56:12 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 astb.pa.uky.edu - - [27/Jul/1995:19:33:03 -0400] "GET /shuttle/missions/sts-70/movies/movies.html HTTP/1.0" 200 2864 ix-sf3-27.ix.netcom.com - - [10/Jul/1995:00:11:39 -0400] "GET /history/history.html HTTP/1.0" 200 1602 sgigate.sgi.com - - [18/Jul/1995:12:18:45 -0400] "GET /software/winvn/wvsmall.gif HTTP/1.0" 200 13372 irc-mac-10.welch.jhu.edu - - [18/Jul/1995:11:48:15 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4267 131.182.153.109 - - [17/Jul/1995:14:39:49 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 130.113.173.8 - - [04/Jul/1995:12:52:58 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 www.cent.saitama-u.ac.jp - - [10/Jul/1995:23:55:29 -0400] "GET /ksc.html HTTP/1.0" 200 7067 drjo015a107.embratel.net.br - - [20/Jul/1995:15:35:47 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 140.163.54.22 - - [09/Jul/1995:12:56:49 -0400] "GET /shuttle/missions/sts-71/sts-71-day-07-highlights.html HTTP/1.0" 200 5341 mippei.isaslan1.isas.ac.jp - - [12/Jul/1995:02:50:52 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527 orpheus.amdahl.com - - [14/Jul/1995:13:45:20 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 bnlx9u.nsls.bnl.gov - - [12/Jul/1995:19:46:09 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 ad04-008.compuserve.com - - [16/Jul/1995:06:33:12 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 eic63.fiu.edu - - [22/Jul/1995:16:46:14 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 www-c1.proxy.aol.com - - [15/Jul/1995:04:24:51 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 vva2-ts1.databank.net - - [17/Jul/1995:12:05:09 -0400] "GET /images/ HTTP/1.0" 200 17688 ppp87.cinenet.net - - [15/Jul/1995:08:19:19 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509 163.205.16.23 - - [25/Jul/1995:14:43:07 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 metabelis.rmit.edu.au - - [13/Jul/1995:21:54:47 -0400] "GET /images/shuttle-patch-small.gif HTTP/1.0" 200 4179 138.87.20.33 - - [07/Jul/1995:16:38:32 -0400] "GET /images/crawlerway-logo.gif HTTP/1.0" 404 - www-c5.proxy.aol.com - - [22/Jul/1995:18:11:40 -0400] "GET /shuttle/missions/sts-75/sts-75-patch-small.gif HTTP/1.0" 200 4179 sparc10_work4.utsi.edu - - [17/Jul/1995:23:04:09 -0400] "GET /history/apollo/apollo-11/images/69HC761.GIF HTTP/1.0" 200 112416 204.251.236.209 - - [07/Jul/1995:12:15:47 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 bootp-75-200.bootp.virginia.edu - - [02/Jul/1995:12:09:17 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 gateway.cary.ibm.com - - [10/Jul/1995:10:38:42 -0400] "GET /history/apollo/apollo-1/images/67HC21.gif HTTP/1.0" 200 181519 netport-3.iu.net - - [25/Jul/1995:16:17:17 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 159.212.144.91 - - [11/Jul/1995:16:42:50 -0400] "GET /history/rocket-history.txt HTTP/1.0" 200 26990 leo.dafa.se - - [27/Jul/1995:02:44:45 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 304 0 zeus.polsl.gliwice.pl - - [25/Jul/1995:08:32:33 -0400] "GET /shuttle/missions/sts-1/mission-sts-1.html HTTP/1.0" 200 8492 ip017.lax.primenet.com - - [07/Jul/1995:09:40:40 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 193.121.1.150 - - [20/Jul/1995:17:49:38 -0400] "GET /shuttle/ HTTP/1.0" 200 957 128.159.122.110 - - [27/Jul/1995:17:07:31 -0400] "GET /finance/suit.gif HTTP/1.0" 200 1294 140.229.25.62 - - [11/Jul/1995:14:48:19 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149 dd13-013.compuserve.com - - [04/Jul/1995:12:59:17 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 pm018-19.dialip.mich.net - - [21/Jul/1995:14:52:49 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 lc1123.aea16.k12.ia.us - - [20/Jul/1995:10:53:46 -0400] "GET /shuttle/missions/sts-71/sts-71-day-05-highlights.html HTTP/1.0" 200 6274 128.159.168.166 - - [12/Jul/1995:14:26:22 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4247 a.doble.wiesbaden-e.cscploenzke.de - - [03/Jul/1995:09:40:38 -0400] "GET /shuttle/technology/images/crew_compartment_13-small.gif HTTP/1.0" 200 79088 ldb.dialup.access.net - - [15/Jul/1995:22:25:51 -0400] "GET /icons/blank.xbm HTTP/1.0" 304 0 saquad004.ttd.sandia.gov - - [20/Jul/1995:17:32:52 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932 193.36.143.121 - - [12/Jul/1995:07:37:18 -0400] "GET /shuttle/countdown/images/cdtclock.gif HTTP/1.0" 200 34688 128.159.146.92 - - [05/Jul/1995:09:35:41 -0400] "GET /images/NASA-logosmall.gif" 200 786 slip144-193.ut.nl.ibm.net - - [11/Jul/1995:16:26:08 -0400] "GET /" 200 7062 eci07w.kuec.kyoto-u.ac.jp - - [12/Jul/1995:02:59:49 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 8528 gateway.amoco.com - - [13/Jul/1995:13:59:13 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13391 kapex2.hns.com - - [07/Jul/1995:11:40:16 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 player.sea.sikorsky.com - - [13/Jul/1995:09:00:20 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 azland.atsc.allied.com - - [13/Jul/1995:08:48:45 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 sumccx8.rdg.ac.uk - - [04/Jul/1995:11:15:32 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 ganymedeh15.netdepot.com - - [08/Jul/1995:11:22:59 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9867 160.193.156.192 - - [26/Jul/1995:05:21:18 -0400] "GET /ksc.html HTTP/1.0" 200 7096 envtest30.gsfc.nasa.gov - - [18/Jul/1995:08:33:33 -0400] "GET /shuttle/missions/sts-73/sts-73-patch-small.gif HTTP/1.0" 200 4179 mars.ark.com - - [06/Jul/1995:23:34:52 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 www-proxy.crl.research.digital.com - - [11/Jul/1995:15:29:01 -0400] "GET /history/apollo/apollo-13/news/ HTTP/1.0" 200 377 ds9.dts.harris.com - - [20/Jul/1995:20:09:21 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 paranet.iea.com - - [26/Jul/1995:19:13:51 -0400] "GET /mdss/stationproc.html HTTP/1.0" 200 2224 irmnovix.ahcpr.gov - - [13/Jul/1995:16:24:47 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 163.205.12.167 - - [11/Jul/1995:15:43:08 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 hal.mic.dundee.ac.uk - - [11/Jul/1995:10:55:49 -0400] "GET /shuttle/missions/sts-59/sts-59-patch-small.gif HTTP/1.0" 200 12181 205.236.175.133 - - [26/Jul/1995:19:35:28 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 dwkm70.usa1.com - - [01/Jul/1995:22:18:19 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0915.jpg HTTP/1.0" 200 39654 www-b4.proxy.aol.com - - [21/Jul/1995:15:57:39 -0400] "GET /shuttle/missions/sts-60/sts-60-patch-small.gif HTTP/1.0" 200 15522 dyn-53.direct.ca - - [05/Jul/1995:19:06:10 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 h-dreamscape.norfolk.infi.net - - [02/Jul/1995:22:16:11 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 microb0.biostat.washington.edu - - [25/Jul/1995:13:07:56 -0400] "GET /icons/image.xbm HTTP/1.0" 200 509 ce5883.ksc.nasa.gov - - [10/Jul/1995:16:09:17 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 helios.astro.uva.nl - - [17/Jul/1995:08:43:43 -0400] "GET /shuttle/countdown/video/livevideo.jpeg HTTP/1.0" 200 32172 ppp5.cent.com - - [22/Jul/1995:16:28:56 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 biscuit.nawcad.navy.mil - - [21/Jul/1995:15:38:11 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 163.205.2.35 - - [25/Jul/1995:15:30:39 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 umslts1_6.umsl.edu - - [01/Jul/1995:11:32:14 -0400] "GET /history/apollo/apollo-17/ HTTP/1.0" 200 1732 jobbins.cat.csiro.au - - [27/Jul/1995:22:22:28 -0400] "GET /shuttle/technology/sts-newsref/sts-lc39.html HTTP/1.0" 200 57344 vettes.inre.asu.edu - - [02/Jul/1995:22:03:33 -0400] "GET /shuttle/resources/orbiters/enterprise.html HTTP/1.0" 200 9732 proxy.exodus.net - - [06/Jul/1995:18:48:27 -0400] "GET /shuttle/missions/sts-51/sts-51-patch-small.gif HTTP/1.0" 200 9258 dynam70.nbnet.nb.ca - - [03/Jul/1995:05:43:28 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 199.172.120.154 - - [07/Jul/1995:01:00:16 -0400] "GET /images/whatsnew.gif HTTP/1.0" 200 651 163.205.11.31 - - [13/Jul/1995:13:02:41 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 ipasd2.camosun.bc.ca - - [27/Jul/1995:18:13:35 -0400] "GET /shuttle/technology/sts-newsref/sts-eclss-wcl.html HTTP/1.0" 200 85465 iqe55l1.it-mitc.louisville.edu - - [05/Jul/1995:12:49:24 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-mir-dock.mpg HTTP/1.0" 200 49152 sqi2.sqi.com - - [10/Jul/1995:17:22:59 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527 192.246.193.18 - - [10/Jul/1995:12:45:59 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630 gw1.octel.com - - [11/Jul/1995:15:00:18 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 163.205.78.3 - - [05/Jul/1995:08:10:02 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 derec - - [18/Jul/1995:17:02:59 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0" 200 15158 wrtv12.wrtv.com - - [04/Jul/1995:13:55:58 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0916.gif HTTP/1.0" 200 25814 mcphymac8.med.nyu.edu - - [20/Jul/1995:08:00:49 -0400] "GET /facilities/lc39a.html HTTP/1.0" 200 7008 ix-lb7-18.ix.netcom.com - - [22/Jul/1995:17:28:28 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 200 9867 webe.hooked.net - - [09/Jul/1995:00:21:38 -0400] "GET /software/winvn/winvn.html HTTP/1.0" 304 0 quigley.roc.servtech.com - - [07/Jul/1995:09:58:36 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13436 ad05-002.compuserve.com - - [26/Jul/1995:06:36:58 -0400] "GET /shuttle/resources/orbiters/columbia-logo.gif HTTP/1.0" 200 11417 192.216.64.107 - - [13/Jul/1995:21:57:38 -0400] "GET / HTTP/1.0" 200 7062 133.41.48.238 - - [03/Jul/1995:06:27:54 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 paul.citynet.net - - [07/Jul/1995:13:54:58 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 ppp134.ukonline.co.uk - - [16/Jul/1995:13:41:41 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 vicsd214.dial.gov.bc.ca - - [06/Jul/1995:00:45:33 -0400] "GET /shuttle/countdown/count.html HTTP/1.0" 200 73231 dialup-5-115.gw.umn.edu - - [04/Jul/1995:20:19:11 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 155.76.35.114 - - [19/Jul/1995:09:13:35 -0400] "GET /shuttle/missions/sts-70/movies/movies.html HTTP/1.0" 200 2435 kkofune.qualcomm.com - - [14/Jul/1995:20:12:38 -0400] "GET /images/lc39a-logo.gif HTTP/1.0" 200 13116 hampton.larc.nasa.gov - - [19/Jul/1995:12:18:32 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 131.247.18.27 - - [19/Jul/1995:12:20:16 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 128.158.47.132 - - [24/Jul/1995:16:37:15 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 71319 clark.pr.mcs.net - - [07/Jul/1995:00:09:31 -0400] "GET /history/apollo/apollo-13/apollo-13-info.html HTTP/1.0" 304 0 pcgdb.nera.no - - [04/Jul/1995:02:17:18 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 cage.ca.geac.com - - [06/Jul/1995:10:05:04 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 pm1a3.sover.net - - [10/Jul/1995:10:14:12 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 131.178.13.219 - - [11/Jul/1995:14:11:20 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 kaiwan106.kaiwan.com - - [03/Jul/1995:05:32:50 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 sol.racsa.co.cr - - [22/Jul/1995:15:55:56 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 dvanzandt.lerc.nasa.gov - - [28/Jul/1995:09:14:46 -0400] "GET /history/apollo/apollo-10/apollo-10-patch-small.gif HTTP/1.0" 200 13539 ix-okc-ok1-19.ix.netcom.com - - [14/Jul/1995:23:47:51 -0400] "GET /shuttle/missions/sts-70/movies/sts-70-tdrs-deploy.mpg HTTP/1.0" 200 692912 d11.inxpress.net - - [01/Jul/1995:23:49:40 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 orlfl2-15.gate.net - - [23/Jul/1995:08:17:46 -0400] "GET /shuttle/technology/images/mission_profile_2-small.gif HTTP/1.0" 304 0 dca00278.slip.digex.net - - [06/Jul/1995:11:14:21 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527 200.13.2.3 - - [20/Jul/1995:19:09:53 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 128.158.44.230 - - [06/Jul/1995:09:49:16 -0400] "GET /shuttle/missions/sts-75/news/ HTTP/1.0" 200 374 128.194.200.96 - - [19/Jul/1995:16:19:58 -0400] "GET /history/apollo/apollo-13/images/70HC418.GIF HTTP/1.0" 200 198285 nntp1.reach.com - - [14/Jul/1995:02:02:19 -0400] "GET /shuttle/technology/sts-newsref/sts-av.html HTTP/1.0" 200 117170 so.scsnet.com - - [14/Jul/1995:14:21:10 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 198.66.75.229 - - [18/Jul/1995:15:19:43 -0400] "GET /shuttle/missions/51-l/images/86HC68.GIF HTTP/1.0" 200 116798 gateway.ps.net - - [14/Jul/1995:08:56:48 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 mattw-pc.ngc.com - - [14/Jul/1995:16:06:33 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 tmpil002.tmp.allied.com - - [25/Jul/1995:16:14:25 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 sloth.ugcs.caltech.edu - - [19/Jul/1995:16:33:35 -0400] "GET /history/mercury/mr-3/mr-3-patch-small.gif HTTP/1.0" 200 19084 efg.efgstl.com - - [01/Jul/1995:18:04:48 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 pcf.dadirect.com.au - - [06/Jul/1995:18:07:36 -0400] "GET /shuttle/countdown/lps/aa/aa.html HTTP/1.0" 200 2751 f-umbc8.umbc.edu - - [13/Jul/1995:16:05:01 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3345 drjo017a152.embratel.net.br - - [02/Jul/1995:21:50:08 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 piweba4y.prodigy.com - - [14/Jul/1995:07:59:14 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 ix-akr-oh2-11.ix.netcom.com - - [01/Jul/1995:12:19:58 -0400] "GET /history/apollo/images/apollo-logo.gif HTTP/1.0" 200 3047 pool64.maple.net - - [24/Jul/1995:01:03:06 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556 net218.metronet.com - - [18/Jul/1995:21:21:02 -0400] "GET /icons/unknown.xbm HTTP/1.0" 200 515 www-c4.proxy.aol.com - - [15/Jul/1995:17:20:08 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260 drjo012a059.embratel.net.br - - [06/Jul/1995:11:14:00 -0400] "GET /ksc.html HTTP/1.0" 200 7067 dpd15.dev.esoc.esa.de - - [24/Jul/1995:07:59:41 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18556 131.182.150.206 - - [07/Jul/1995:08:36:58 -0400] "GET /shuttle/technology/images/crew_compartment_13-small.gif HTTP/1.0" 200 79088 piweba3y.prodigy.com - - [05/Jul/1995:22:41:49 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 nanaimo.ark.com - - [06/Jul/1995:23:47:47 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3998 workstation.darpa.mil - - [03/Jul/1995:09:46:49 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 future.dreamscape.com - - [17/Jul/1995:16:48:09 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 cs1-12.leh.ptd.net - - [22/Jul/1995:12:31:23 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 163.205.180.17 - - [24/Jul/1995:09:10:47 -0400] "GET /mdss/s_md-2.gif HTTP/1.0" 200 15528 ccc165.bham.ac.uk - - [06/Jul/1995:10:35:36 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 12722 dal234.pic.net - - [20/Jul/1995:11:28:04 -0400] "GET /history/gemini/gemini.html HTTP/1.0" 200 2522 rasputin.caltech.edu - - [23/Jul/1995:09:57:19 -0400] "GET /history/apollo/apollo-4/apollo-4.html HTTP/1.0" 200 3542 128.159.154.93 - - [03/Jul/1995:12:54:19 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 130.99.73.100 - - [07/Jul/1995:11:28:00 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-launch.mpg HTTP/1.0" 200 1121554 fifteen.aristotle.net - - [15/Jul/1995:17:10:09 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 urania.harvard.edu - - [05/Jul/1995:16:29:15 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 304 0 walt.cfr.washington.edu - - [28/Jul/1995:02:30:46 -0400] "GET /images/gemini-logo.gif HTTP/1.0" 200 4452 titan02f - - [12/Jul/1995:11:28:34 -0400] "GET /shuttle/countdown/images/cdtclock.gif HTTP/1.0" 200 34688 trusty.lmsc.lockheed.com - - [13/Jul/1995:09:46:47 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3585 128.159.140.34 - - [03/Jul/1995:16:57:03 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 pm1-23.magicnet.net - - [02/Jul/1995:19:01:15 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 304 0 mail2.sas.upenn.edu - - [05/Jul/1995:23:35:45 -0400] "GET /history/history.html HTTP/1.0" 200 1602 ns.scn.de - - [20/Jul/1995:09:50:16 -0400] "GET /shuttle/resources/orbiters/challenger-logo.gif HTTP/1.0" 304 0 scmac30.gatech.edu - - [17/Jul/1995:17:02:41 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0" 200 14745 siltb10.orl.mmc.com - - [14/Jul/1995:21:30:00 -0400] "GET /history/apollo/images/apollo-logo1.gif HTTP/1.0" 200 1173 ppp122.po.iijnet.or.jp - - [02/Jul/1995:06:09:09 -0400] "GET /history/apollo/apollo-13/videos/ HTTP/1.0" 200 381 disarray.demon.co.uk - - [16/Jul/1995:07:45:14 -0400] "GET /shuttle/technology/sts-newsref/stsover-launch.html HTTP/1.0" 200 90684 204.48.128.59 - - [01/Jul/1995:18:16:29 -0400] "GET /shuttle/resources/orbiters/atlantis.html HTTP/1.0" 200 7025 ix-lv6-29.ix.netcom.com - - [01/Jul/1995:20:24:35 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310 poppy.hensa.ac.uk - - [08/Jul/1995:11:21:50 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0911.jpg HTTP/1.0" 200 45966 slip2.niagara.com - - [26/Jul/1995:20:34:44 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 organic14.chem.ufl.edu - - [21/Jul/1995:10:51:14 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324 siltb10.orl.mmc.com - - [15/Jul/1995:22:07:37 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 suns8.crosfield.co.uk - - [18/Jul/1995:09:53:26 -0400] "GET /history/gemini/flight-summary.txt HTTP/1.0" 200 2794 ottgate2.bnr.ca - - [21/Jul/1995:09:43:22 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3260 dialup-72.werple.mira.net.au - - [05/Jul/1995:09:32:06 -0400] "GET /cgi-bin/imagemap/countdown?320,279 HTTP/1.0" 302 98 argon.iap.physik.th-darmstadt.de - - [02/Jul/1995:07:10:56 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 adder.cee.hw.ac.uk - - [25/Jul/1995:04:22:46 -0400] "GET /shuttle/missions/sts-70/images/images.html HTTP/1.0" 200 8657 17.127.19.189 - - [03/Jul/1995:11:32:43 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 netcore.ozonline.com.au - - [06/Jul/1995:06:51:40 -0400] "GET /shuttle/missions/sts-40/sts-40-patch-small.gif HTTP/1.0" 200 10297 mudd3.library.yale.edu - - [11/Jul/1995:15:22:46 -0400] "GET /icons/blank.xbm HTTP/1.0" 200 509 www-c2.proxy.aol.com - - [16/Jul/1995:21:28:26 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 131.182.160.219 - - [13/Jul/1995:10:51:05 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 vagrant.vf.mmc.com - - [17/Jul/1995:09:24:04 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 304 0 128.159.146.92 - - [18/Jul/1995:15:08:55 -0400] "GET /shuttle/technology/sts-newsref/stsref-toc.html" 200 84905 eman.tiac.net - - [01/Jul/1995:23:10:08 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 304 0 129.30.164.29 - - [03/Jul/1995:10:57:04 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 dmontpe.hip.cam.org - - [02/Jul/1995:22:44:24 -0400] "GET /news/sci.space.news/archive/sci-space-news-12-apr-1995-61.txt HTTP/1.0" 200 226251 ssbuv.gsfc.nasa.gov - - [03/Jul/1995:11:06:12 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 aplexus.jhuapl.edu - - [19/Jul/1995:17:09:45 -0400] "GET /history/mercury/mercury-goals.txt HTTP/1.0" 200 421 194.72.68.123 - - [10/Jul/1995:15:24:54 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 flare20.solar.isas.ac.jp - - [28/Jul/1995:05:27:43 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 10136 pallas3.zcu.cz - - [13/Jul/1995:08:30:51 -0400] "GET /shuttle/countdown/images/cdtclock-large.gif HTTP/1.0" 200 49152 slip165-180.on.ca.ibm.net - - [15/Jul/1995:13:21:38 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13389 rush.internic.net - - [13/Jul/1995:03:21:07 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0" 200 752 192.106.166.159 - - [02/Jul/1995:20:55:51 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8677 tmart.demon.co.uk - - [23/Jul/1995:10:22:28 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 duck.ksc.nasa.gov - - [07/Jul/1995:13:21:44 -0400] "GET /cgi-bin/imagemap/countdown?104,181 HTTP/1.0" 302 110 129.63.128.50 - - [12/Jul/1995:08:53:04 -0400] "GET /shuttle/resources/orbiters/endeavour-logo.gif HTTP/1.0" 200 5052 slip214.basenet.net - - [06/Jul/1995:10:46:29 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 12722 bill.ksc.nasa.gov - - [12/Jul/1995:11:49:01 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3584 ppp6.trendline.co.il - - [22/Jul/1995:14:56:57 -0400] "GET /shuttle/countdown/lps/mstr/mstr.html HTTP/1.0" 200 3012 igate.nrc.gov - - [17/Jul/1995:13:44:28 -0400] "GET /history/apollo/apollo-1/sounds/ HTTP/1.0" 200 378 170.182.152.10 - - [06/Jul/1995:11:17:28 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 yhm0072.bekkoame.or.jp - - [23/Jul/1995:04:16:43 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149 sci130te.sci.port.ac.uk - - [12/Jul/1995:07:44:30 -0400] "GET /shuttle/missions/sts-64/mission-sts-64.html HTTP/1.0" 200 58311 hobbes.indirect.com - - [08/Jul/1995:13:29:12 -0400] "GET /shuttle/missions/100th.html HTTP/1.0" 200 32303 rrisrv01.rr.intel.com - - [23/Jul/1995:17:49:59 -0400] "GET /shuttle/missions/sts-66/mission-sts-66.html HTTP/1.0" 200 174016 f181-169.net.wisc.edu - - [16/Jul/1995:08:10:08 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4247 crystal.ims.ac.jp - - [15/Jul/1995:01:20:20 -0400] "GET /history/apollo/apollo-13/images/70HC507.GIF HTTP/1.0" 200 128894 163.205.11.31 - - [26/Jul/1995:08:56:16 -0400] "GET /ksc.html HTTP/1.0" 200 7096 lgbppp45.uni-c.dk - - [18/Jul/1995:13:27:27 -0400] "GET /shuttle/missions/sts-69/movies/ws-animation-onorbit.mpg HTTP/1.0" 200 57344 camus.mty.itesm.mx - - [01/Jul/1995:01:36:59 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 3985 a56.fys.kuleuven.ac.be - - [12/Jul/1995:06:02:11 -0400] "GET /shuttle/missions/sts-70/images/KSC-95EC-0823.gif HTTP/1.0" 200 30185 dawn14.cs.berkeley.edu - - [01/Jul/1995:14:44:24 -0400] "GET /shuttle/missions/sts-34/mission-sts-34.html HTTP/1.0" 200 5787 pwsmith.tcn.net - - [16/Jul/1995:22:21:07 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 www-c5.proxy.aol.com - - [15/Jul/1995:16:49:58 -0400] "GET /elv/endball.gif HTTP/1.0" 200 306 chernobog.cad.ksc.nasa.gov - - [17/Jul/1995:07:19:54 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 142.36.116.181 - - [05/Jul/1995:13:12:20 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 130.99.33.137 - - [14/Jul/1995:10:49:03 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 pipe5.nyc.pipeline.com - - [19/Jul/1995:11:30:23 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 ash2.ramlink.net - - [25/Jul/1995:04:35:48 -0400] "GET /history/apollo/apollo-11/apollo-11.html HTTP/1.0" 200 44877 bastion.sware.com - - [02/Jul/1995:13:34:55 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932 ewong.sp.trw.com - - [06/Jul/1995:19:00:23 -0400] "GET /history/mercury/ma-9/ma-9.html HTTP/1.0" 200 1135 metz.une.edu.au - - [02/Jul/1995:06:33:29 -0400] "GET /ksc.html HTTP/1.0" 200 7074 neptune.uqtr.uquebec.ca - - [06/Jul/1995:21:06:23 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 truro-ts-06.nstn.ca - - [24/Jul/1995:20:52:46 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 ts5-13.westwood.ts.ucla.edu - - [03/Jul/1995:00:53:14 -0400] "GET /cgi-bin/imagemap/fr?275,24 HTTP/1.0" 302 79 nnyynn.mixcom.com - - [12/Jul/1995:22:29:36 -0400] "GET /shuttle/countdown/lps/fr.html HTTP/1.0" 200 1879 rosch.larc.nasa.gov - - [18/Jul/1995:10:46:48 -0400] "GET /shuttle/missions/sts-70/sts-70-patch-small.gif HTTP/1.0" 200 5026 jsanz.agr.upv.es - - [14/Jul/1995:12:05:35 -0400] "GET /shuttle/missions/sts-68/sts-68-patch-small.gif HTTP/1.0" 304 0 tsppp9.cac.psu.edu - - [12/Jul/1995:19:01:38 -0400] "GET /shuttle/missions/sts-63/mission-sts-63.html HTTP/1.0" 200 53036 news.ti.com - - [05/Jul/1995:19:40:22 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 gw.alsys.com - - [20/Jul/1995:16:17:04 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3347 rs11-annex3.sfu.ca - - [14/Jul/1995:02:50:06 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18114 pm4_19.digital.net - - [26/Jul/1995:21:56:59 -0400] "GET /history/apollo/images/apollo-small.gif HTTP/1.0" 200 9630 ix-mia1-02.ix.netcom.com - - [15/Jul/1995:11:33:39 -0400] "GET /ksc.html HTTP/1.0" 200 7071 desk.net6c.io.org - - [06/Jul/1995:10:12:36 -0400] "GET /facilities/mlp.html HTTP/1.0" 200 2653 mgan027.isc.rit.edu - - [14/Jul/1995:09:23:43 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 140.95.203.99 - - [06/Jul/1995:23:21:36 -0400] "GET /shuttle/missions/sts-68/sts-68-patch-small.gif HTTP/1.0" 200 17459 fermi.pha.jhu.edu - - [14/Jul/1995:16:43:29 -0400] "GET /shuttle/missions/missions.html HTTP/1.0" 200 8678 ad13-062.compuserve.com - - [11/Jul/1995:21:32:10 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13374 53.138.med.umich.edu - - [13/Jul/1995:13:00:32 -0400] "GET /htbin/cdt_main.pl HTTP/1.0" 200 3506 vagrant.vf.mmc.com - - [05/Jul/1995:12:31:17 -0400] "GET /images/kscmap-tiny.gif HTTP/1.0" 200 2537 163.205.16.21 - - [26/Jul/1995:15:58:58 -0400] "GET /payloads/org/cg-iso/nethelp/images/newslogo.gif HTTP/1.0" 200 7185 dd03-029.compuserve.com - - [13/Jul/1995:03:49:50 -0400] "GET /shuttle/missions/51-l/news HTTP/1.0" 302 - 158.140.188.131 - - [13/Jul/1995:06:51:33 -0400] "GET /shuttle/countdown/countdown.html HTTP/1.0" 200 4247 158.217.4.203 - - [28/Jul/1995:05:39:15 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 hpcsos.col.hp.com - - [22/Jul/1995:15:15:47 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 131.182.28.222 - - [06/Jul/1995:12:48:05 -0400] "GET /shuttle/countdown/lps/c-3-4/c-3-4.html HTTP/1.0" 200 5338 128.159.132.53 - - [11/Jul/1995:07:31:06 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 128.159.122.29 - - [11/Jul/1995:14:43:51 -0400] "GET /finance/tour.gif HTTP/1.0" 200 2845 turboduk.seanet.com - - [07/Jul/1995:14:42:15 -0400] "GET /shuttle/missions/sts-69/mission-sts-69.html HTTP/1.0" 200 4324 205.212.115.102 - - [03/Jul/1995:12:45:35 -0400] "GET / HTTP/1.0" 200 7074 physics-105-07.physics.siu.edu - - [25/Jul/1995:17:43:53 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 suntest.kaiser.org - - [12/Jul/1995:17:21:38 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 pbadri-ss10.cisco.com - - [25/Jul/1995:21:48:16 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 71319 lanrover4-line1.uoregon.edu - - [06/Jul/1995:02:07:24 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 200 12054 ppp023.st.rim.or.jp - - [09/Jul/1995:05:02:48 -0400] "GET /shuttle/missions/sts-71/images/images.html HTTP/1.0" 200 7634 jsc-b32-mac167.jsc.nasa.gov - - [21/Jul/1995:13:51:47 -0400] "GET /shuttle/technology/sts-newsref/sts-apu.html HTTP/1.0" 200 161920 131.96.60.50 - - [15/Jul/1995:16:12:51 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 p18-43.dialup.uvic.ca - - [05/Jul/1995:20:22:12 -0400] "GET /history/apollo/images/apollo-logo.gif HTTP/1.0" 200 3047 sw25-157.iol.it - - [27/Jul/1995:02:27:30 -0400] "GET /shuttle/missions/sts-71/news/ksc-status-06-29-95.txt HTTP/1.0" 200 3471 rzstud2.rz.uni-karlsruhe.de - - [17/Jul/1995:10:40:07 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 dialup-2-92.gw.umn.edu - - [17/Jul/1995:00:32:46 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 macrwm.msfc.nasa.gov - - [25/Jul/1995:11:10:13 -0400] "GET /shuttle/missions/sts-7/mission-sts-7.html HTTP/1.0" 200 6195 eos.informatik.uni-hannover.de - - [15/Jul/1995:09:46:18 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 knowling.biz.uiowa.edu - - [13/Jul/1995:13:08:47 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13391 hp107.den.mmc.com - - [15/Jul/1995:14:28:57 -0400] "GET /elv/elvpage.htm HTTP/1.0" 200 8454 dialupa135.intex.net - - [04/Jul/1995:13:02:49 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0882.jpg HTTP/1.0" 200 77163 philly17.voicenet.com - - [02/Jul/1995:17:32:40 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 slip42.van2.pacifier.com - - [07/Jul/1995:00:24:32 -0400] "GET /shuttle/missions/sts-71/movies/sts-71-mir-dock.mpg HTTP/1.0" 200 49152 dd01-009.compuserve.com - - [07/Jul/1995:22:16:09 -0400] "GET /shuttle/missions/sts-69/sts69.bmp HTTP/1.0" 200 196608 alyssa.prodigy.com - - [08/Jul/1995:20:51:45 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 ppp-hck-1-39.ios.com - - [20/Jul/1995:21:15:37 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 ix-tok1-26.ix.netcom.com - - [08/Jul/1995:03:04:21 -0400] "GET /shuttle/missions/sts-71/sts-71-patch-small.gif HTTP/1.0" 304 0 165.113.166.20 - - [17/Jul/1995:19:01:59 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 fw.tyson.com - - [28/Jul/1995:12:27:42 -0400] "GET /history/apollo/apollo-13/apollo-13-patch-small.gif HTTP/1.0" 200 12859 ix-dfw9-21.ix.netcom.com - - [01/Jul/1995:20:03:58 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 provo11.xmission.com - - [15/Jul/1995:14:21:10 -0400] "GET /shuttle/technology/images/et-intertank_1-small.gif HTTP/1.0" 200 49152 ad09-001.compuserve.com - - [06/Jul/1995:14:48:55 -0400] "GET /cgi-bin/imagemap/countdown?106,211 HTTP/1.0" 302 95 crc1-fddi.cris.com - - [15/Jul/1995:20:09:03 -0400] "GET /history/apollo/apollo-13/apollo-13-info.html HTTP/1.0" 200 1583 sunserver2.aston.ac.uk - - [27/Jul/1995:10:56:20 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 304 0 130.64.209.40 - - [06/Jul/1995:12:12:02 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 198.5.164.239 - - [10/Jul/1995:14:38:01 -0400] "GET /shuttle/resources/orbiters/orbiters-logo.gif HTTP/1.0" 200 1932 earla.dfrc.nasa.gov - - [06/Jul/1995:14:15:05 -0400] "GET /history/apollo/images/footprint-small.gif HTTP/1.0" 200 18149 inet3.fei.com - - [10/Jul/1995:11:15:08 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 cest.cle.ab.com - - [18/Jul/1995:11:40:55 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 128.217.62.81 - - [06/Jul/1995:14:41:34 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 studaff5.colloff.emory.edu - - [03/Jul/1995:12:43:11 -0400] "GET /history/gemini/gemini.html HTTP/1.0" 200 2522 www-b3.proxy.aol.com - - [07/Jul/1995:21:57:21 -0400] "GET /history/apollo/images/apollo-logo.gif HTTP/1.0" 200 3047 palona1.cns.hp.com - - [25/Jul/1995:19:52:30 -0400] "GET /history/apollo/apollo-11/images/69HC681.GIF HTTP/1.0" 200 85285 163.205.11.31 - - [13/Jul/1995:12:31:14 -0400] "GET /images/WORLD-logosmall.gif HTTP/1.0" 200 669 burger.letters.com - - [01/Jul/1995:00:12:57 -0400] "GET /shuttle/countdown/video/livevideo.gif HTTP/1.0" 200 73132 dialin2.iti2.net - - [04/Jul/1995:05:30:26 -0400] "GET /shuttle/countdown/ HTTP/1.0" 304 0 sandersen.usace.mil - - [27/Jul/1995:17:27:50 -0400] "GET /ksc.html HTTP/1.0" 200 7280 ppp120.amaranth.com - - [16/Jul/1995:00:52:37 -0400] "GET /images/shuttle-patch-logo.gif HTTP/1.0" 200 891 ip8.herndon2.va.interramp.com - - [01/Jul/1995:22:16:25 -0400] "GET /history/apollo/apollo.html HTTP/1.0" 200 3258 doug.connectsoft.com - - [13/Jul/1995:12:25:35 -0400] "GET /icons/menu.xbm HTTP/1.0" 200 527 ad02-051.compuserve.com - - [19/Jul/1995:20:17:20 -0400] "GET /images/mlp-logo.gif HTTP/1.0" 200 28426 cobain.arcs.bcit.bc.ca - - [20/Jul/1995:18:20:39 -0400] "GET /history/skylab/skylab-2.html HTTP/1.0" 200 1708 pc59.sp.msanet.com - - [26/Jul/1995:15:18:23 -0400] "GET /shuttle/missions/sts-71/mission-sts-71.html HTTP/1.0" 200 13450 128.158.54.15 - - [18/Jul/1995:11:47:27 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 blazemonger.pc.cc.cmu.edu - - [12/Jul/1995:01:31:17 -0400] "GET /htbin/cdt_clock.pl HTTP/1.0From: " 200 752 163.205.23.107 - - [27/Jul/1995:08:25:45 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 194.112.84.17 - - [27/Jul/1995:11:45:48 -0400] "GET /shuttle/missions/sts-35/mission-sts-35.html HTTP/1.0" 200 11906 john.sp.trw.com - - [21/Jul/1995:15:32:22 -0400] "GET /images/launch-logo.gif HTTP/1.0" 200 1713 crc6.cris.com - - [02/Jul/1995:02:23:32 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 piweba3y.prodigy.com - - [06/Jul/1995:20:44:18 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 vertex131.worldweb.com - - [06/Jul/1995:00:56:04 -0400] "GET /shuttle/technology/images/srb_mod_compare_3-small.gif HTTP/1.0" 200 55666 gw1.magec.com - - [19/Jul/1995:11:10:53 -0400] "GET /images/mercury-logo.gif HTTP/1.0" 200 6588 pc5.pm2-2.eunet.no - - [01/Jul/1995:19:31:34 -0400] "GET /shuttle/missions/sts-71/images/KSC-95EC-0423.gif HTTP/1.0" 200 64939 msbelofsky.ross.tasc.com - - [13/Jul/1995:08:39:15 -0400] "GET /history/apollo/apollo-13/apollo-13.html HTTP/1.0" 200 18114 128.159.111.186 - - [11/Jul/1995:16:32:03 -0400] "GET /cgi-bin/imagemap/countdown70?182,290 HTTP/1.0" 302 110 xtsd0104.it.wsu.edu - - [23/Jul/1995:20:52:03 -0400] "GET /history/apollo/images/footprint-logo.gif HTTP/1.0" 200 4209 maclark.oro.net - - [05/Jul/1995:15:05:36 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 ts1-and-29.iquest.net - - [09/Jul/1995:17:47:48 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 dd13-052.compuserve.com - - [04/Jul/1995:19:26:29 -0400] "GET /ksc.html HTTP/1.0" 200 7074 anonymous.chevron.com - - [02/Jul/1995:22:16:27 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 ppp034.inreach.com - - [12/Jul/1995:19:54:28 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 n1032025.ksc.nasa.gov - - [26/Jul/1995:08:47:37 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 n4.firga.sun.ac.za - - [28/Jul/1995:09:58:56 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 n868385.ksc.nasa.gov - - [27/Jul/1995:16:02:08 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 128.118.33.153 - - [10/Jul/1995:17:13:39 -0400] "GET /shuttle/technology/images/srb_mod_compare_1-small.gif HTTP/1.0" 200 36902 cs5002.edu.uni-klu.ac.at - - [07/Jul/1995:20:47:52 -0400] "GET /images/launchmedium.gif HTTP/1.0" 200 11853 garymak.pr.mcs.net - - [12/Jul/1995:01:52:26 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 sys1006392.orl.mmc.com - - [07/Jul/1995:15:55:40 -0400] "GET /history/apollo/flight-summary.txt HTTP/1.0" 200 5086 arctic.nad.northrop.com - - [05/Jul/1995:09:13:40 -0400] "GET /history/apollo/images/apollo-logo.gif HTTP/1.0" 200 3047 ccc165.bham.ac.uk - - [06/Jul/1995:10:34:07 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 194.65.16.131 - - [01/Jul/1995:12:23:44 -0400] "GET /images/KSC-logosmall.gif HTTP/1.0" 200 1204 129.31.188.196 - - [04/Jul/1995:12:25:16 -0400] "GET /images/ksclogosmall.gif HTTP/1.0" 200 3635 awb_nichols.chinalake.navy.mil - - [10/Jul/1995:20:36:30 -0400] "GET /history/mercury/mercury-spacecraft.txt HTTP/1.0" 200 761 marina.cea.berkeley.edu - - [12/Jul/1995:03:54:33 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 screen.lotus.com - - [10/Jul/1995:11:10:07 -0400] "GET / HTTP/1.0" 200 7067 163.206.113.134 - - [12/Jul/1995:14:28:25 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 304 0 ix-mia1-03.ix.netcom.com - - [13/Jul/1995:06:28:16 -0400] "GET /images/ksclogo-medium.gif HTTP/1.0" 200 5866 anhinga.egr.uh.edu - - [01/Jul/1995:13:38:58 -0400] "GET /images/USA-logosmall.gif HTTP/1.0" 200 234 m005.fn.net - - [15/Jul/1995:23:14:42 -0400] "GET / HTTP/1.0" 200 7071 slbri2p06.ozemail.com.au - - [16/Jul/1995:20:04:23 -0400] "GET /shuttle/missions/sts-67/images/KSC-95EC-0395.gif HTTP/1.0" 200 138988 163.205.2.132 - - [20/Jul/1995:08:49:14 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 osip75.ionet.net - - [16/Jul/1995:18:21:32 -0400] "GET /shuttle/countdown/video/livevideo2.gif HTTP/1.0" 200 49152 199.201.186.103 - - [23/Jul/1995:16:37:30 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 304 0 ahaa5.ccs.itd.umich.edu - - [11/Jul/1995:15:53:58 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 48511 webgate1.mot.com - - [07/Jul/1995:13:50:28 -0400] "GET /history/apollo/apollo-13/sounds/a13_001.wav HTTP/1.0" 200 280014 piweba4y.prodigy.com - - [22/Jul/1995:02:09:14 -0400] "GET /shuttle/countdown/ HTTP/1.0" 200 4324 gw4.att.com - - [03/Jul/1995:13:35:01 -0400] "GET /history/apollo/apollo-11/apollo-11.html HTTP/1.0" 200 41397 fl9_79_120.jmb.bah.com - - [06/Jul/1995:12:56:49 -0400] "GET /images/NASA-logosmall.gif HTTP/1.0" 200 786 ritch.vnet.net - - [07/Jul/1995:21:11:55 -0400] "GET /history/history.html HTTP/1.0" 200 1602 ix-stl4-19.ix.netcom.com - - [14/Jul/1995:22:21:43 -0400] "GET /shuttle/countdown/count70.gif HTTP/1.0" 200 46573 www-a1.proxy.aol.com - - [09/Jul/1995:20:14:47 -0400] "GET /elv/endball.gif HTTP/1.0" 304 0 147.149.58.91 - - [20/Jul/1995:04:56:04 -0400] "GET /images/whatsnew.gif HTTP/1.0" 200 651 204.240.181.3 - - [24/Jul/1995:13:52:50 -0400] "GET /shuttle/missions/sts-69/sts-69-patch-small.gif HTTP/1.0" 200 8083 163.205.23.71 - - [10/Jul/1995:11:03:37 -0400] "GET /shuttle/countdown/lps/fr.gif HTTP/1.0" 200 30232 vagrant.vf.mmc.com - - [27/Jul/1995:13:17:08 -0400] "GET /images/ksclogo.gif HTTP/1.0" 200 14298 mac161.out.trw.com - - [03/Jul/1995:13:52:02 -0400] "GET /shuttle/missions/sts-70/mission-sts-70.html HTTP/1.0" 200 13468 portal.idacom.hp.com - - [26/Jul/1995:12:32:43 -0400] "GET /images/MOSAIC-logosmall.gif HTTP/1.0" 200 363 rex/vignettes/url_parsing.Rmd0000644000176200001440000000772513051324404016060 0ustar liggesusers--- title: "URL Validation" author: "Jim Hester" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{URL Validation} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- Consider the task of correctly [validating a URL](https://mathiasbynens.be/demo/url-regex). From that page two conclusions can be made. 1. Validating URLs require complex regular expressions. 2. Creating a correct regular expression is hard! (only 1 out of 13 regexs were valid for all cases). Because of this one may be tempted to simply copy the best regex you can find ([gist](https://gist.github.com/dperini/729294)). The problem with this is that while you can copy it now, what happens later when you find a case that is not handled correctly? Can you correctly interpret and modify this? ```{r url_parsing_stock, eval=F} "^(?:(?:http(?:s)?|ftp)://)(?:\\S+(?::(?:\\S)*)?@)?(?:(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)(?:\\.(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)*(?:\\.(?:[a-z0-9\u00a1-\uffff]){2,})(?::(?:\\d){2,5})?(?:/(?:\\S)*)?$" ``` However if you re-create the regex with `rex` it is much easier to understand and modify later if needed. ```{r url_parsing_url} library(rex) valid_chars <- rex(except_some_of(".", "/", " ", "-")) re <- rex( start, # protocol identifier (optional) + // group(list("http", maybe("s")) %or% "ftp", "://"), # user:pass authentication (optional) maybe(non_spaces, maybe(":", zero_or_more(non_space)), "@"), #host name group(zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)), #domain name zero_or_more(".", zero_or_more(valid_chars, zero_or_more("-")), one_or_more(valid_chars)), #TLD identifier group(".", valid_chars %>% at_least(2)), # server port number (optional) maybe(":", digit %>% between(2, 5)), # resource path (optional) maybe("/", non_space %>% zero_or_more()), end ) ``` We can then validate that it correctly identifies both good and bad URLs. (_IP address validation removed_) ```{r url_parsing_validate} good <- c("http://foo.com/blah_blah", "http://foo.com/blah_blah/", "http://foo.com/blah_blah_(wikipedia)", "http://foo.com/blah_blah_(wikipedia)_(again)", "http://www.example.com/wpstyle/?p=364", "https://www.example.com/foo/?bar=baz&inga=42&quux", "http://✪df.ws/123", "http://userid:password@example.com:8080", "http://userid:password@example.com:8080/", "http://userid@example.com", "http://userid@example.com/", "http://userid@example.com:8080", "http://userid@example.com:8080/", "http://userid:password@example.com", "http://userid:password@example.com/", "http://➡.ws/䨹", "http://⌘.ws", "http://⌘.ws/", "http://foo.com/blah_(wikipedia)#cite-1", "http://foo.com/blah_(wikipedia)_blah#cite-1", "http://foo.com/unicode_(✪)_in_parens", "http://foo.com/(something)?after=parens", "http://☺.damowmow.com/", "http://code.google.com/events/#&product=browser", "http://j.mp", "ftp://foo.bar/baz", "http://foo.bar/?q=Test%20URL-encoded%20stuff", "http://مثال.إختبار", "http://例子.测试", "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", "http://1337.net", "http://a.b-c.de", "http://223.255.255.254") bad <- c( "http://", "http://.", "http://..", "http://../", "http://?", "http://??", "http://??/", "http://#", "http://##", "http://##/", "http://foo.bar?q=Spaces should be encoded", "//", "//a", "///a", "///", "http:///a", "foo.com", "rdar://1234", "h://test", "http:// shouldfail.com", ":// should fail", "http://foo.bar/foo(bar)baz quux", "ftps://foo.bar/", "http://-error-.invalid/", "http://-a.b.co", "http://a.b-.co", "http://0.0.0.0", "http://3628126748", "http://.www.foo.bar/", "http://www.foo.bar./", "http://.www.foo.bar./") all(grepl(re, good) == TRUE) all(grepl(re, bad) == FALSE) ``` You can now see the power and expressiveness of building regular expressions with `rex`! rex/README.md0000644000176200001440000000456713172161237012346 0ustar liggesusers# Rex [![Build Status](https://travis-ci.org/kevinushey/rex.png?branch=master)](https://travis-ci.org/kevinushey/rex) [![codecov.io](https://codecov.io/github/kevinushey/rex/coverage.svg?branch=master)](https://codecov.io/github/kevinushey/rex?branch=master) ### Friendly Regular Expressions Regular expressions are very powerful feature, however they are often difficult to interpret. Rex allows you to build complex regular expressions from human readable expressions. So instead of writing (and later trying to decipher) ```r r <- "^(?:(((?:[^:])+)://))?((?:(?:(?!:/).)*)+)(?:(:([[:digit:]]+)))?(?:(/.*))?$" ``` You can write ```r r <- rex( start, ## match the protocol -- may exist or may not maybe(capture( capture(except_some_of(":")), "://" )), ## match the path capture(one_or_more(not(":/"))), ## get the port maybe(capture(":", capture(numbers))), ## and the rest maybe(capture("/", anything)), end ) ``` While these expressions are a big longer than their corresponding regular expression, they are much more readable and maintainable. ## Installation ```r library(devtools) install_github("kevinushey/rex") ``` ## Usage The vignettes have longer form usage examples. - [URL Validation](http://rpubs.com/jimhester/rex-url_parsing) - [Webserver Log Parsing](http://rpubs.com/jimhester/rex-log_parsing) Each `rex()` function call can include a number of functions and shortcuts. For a full list of the functions available please see `?rex` and `?shortcuts`. ### Rex Mode Rex functions are not exported because they are only useful within `rex()` calls, but they can be temporarily attached using `rex_mode()` which allows them to be auto-completed. ### Using Rex in other packages Using `rex` in other packages will generate spurious NOTEs from `R CMD check` unless you include a call to `rex::register_shortcuts()` with your package name somewhere in your package source. This function registers all of the rex shortcuts as valid variables fixing the NOTEs. ## See Also - [Regularity](https://github.com/andrewberls/regularity) - Ruby library that partially inspired `rex`. - [PCRE](http://www.pcre.org/) - Perl Compatible Regular Expressions, the engine that `rex` regular expressions use. - [Perl 5 Regular Expressions](http://perldoc.perl.org/perlre.html) - Perl regular expression documentation, which are nearly 100% compatible with PCRE. rex/MD50000644000176200001440000000650713172201330011360 0ustar liggesusersab6ce331a57ff9cecc421f00088fb50a *DESCRIPTION a066f78ea5d786ee1d559efc84241161 *LICENSE d8990f9388f6a1c96689f2cb2ae62728 *NAMESPACE 771f0fd16ce646696da13fd649307a30 *NEWS.md 5c321a12d9ecfa525ca2fb20725f3f17 *R/aaa.R b780a775089dd88efcf67a0635a0058e *R/capture.R 39f4c60efe6d71c5b3eb3ec8d19f3873 *R/character_class.R ac49ea725b7298bf9cbfb957341e215a *R/counts.R a5c75daa0b7a85e6df7f1b023230af9c *R/escape.R 1a98058551b8a40171c53866993b54bc *R/lookarounds.R ceb51d4dc8e4b7c4cd36d3a6cc6da0a8 *R/match.R e0085ac9fb1905afeb5f6849e70c3eb3 *R/or.R 22e4556e954fd76e09fb434394514ac9 *R/rex-mode.R a6345e1ede16ebad3955b322bda94034 *R/rex.R 7f338bfcf826a74fb4e32a5b553f8e99 *R/shortcuts.R a765ae4fd76afb1326aed1ba61a80f38 *R/utils.R ae5f05556325f5ab268341b2de50c377 *R/wildcards.R eb0afc6c958bc758a3d79ae339230369 *R/zzz.R 6d1a21e401ddc02f332804b7c556a0ea *README.md 95788e21ded42a114a01d96383d0c944 *build/vignette.rds 57c2c6e5917b7196905f8c1aa6a1075e *inst/doc/log_parsing.R 856eae22b696240b244ce83e9796f0fb *inst/doc/log_parsing.Rmd dd4c73b550f222d64cd9f08432d943cf *inst/doc/log_parsing.html 7f84ce21bd0d9c880373263ca3f93523 *inst/doc/url_parsing.R 148cd376374385379c63ae6c70161638 *inst/doc/url_parsing.Rmd cb58820e8e8a847d5b21146942959bee *inst/doc/url_parsing.html ecf7fa080f23298c2d3e7cef8c603da2 *man/as.regex.Rd a33e8fa7e101e58fbd3e040566dc1ca3 *man/capture.Rd ab8b7fc364622a431f7606f38b5a48ec *man/character_class.Rd 464b0ae52a588e856d320d9a5bc3e954 *man/character_class_escape.Rd 1366002eaec67650d7d783b9b857134d *man/counts.Rd c4d49be8d7113417ec8306dac065e6fa *man/escape.Rd 1c072a1f272cfae1fbbf28728152d52c *man/group.Rd 0b34b4fa838475e16746761b25e0d6e9 *man/lookarounds.Rd 7a1462cbe7a86ecd272c6da02e4a1750 *man/not.Rd 46d35e3775a526639a847ba92fae039c *man/or.Rd a64a7ea44fcaa33c2d3ad0f7909cbc3e *man/pipe.Rd ce9efbfb53f1d57907baf317e136f5ea *man/re_matches.Rd 2f3c777ef19000b73df9240172cb7e26 *man/re_substitutes.Rd d4251542543cbc53aa3e0a894ad4a55f *man/regex.Rd a2f005243efa94175ef55c8b7265b689 *man/register_shortcuts.Rd 9c5a30b2cf7845e88ffc1b58d8764580 *man/rex.Rd 8aed86b57e383e0529aac57cf289e00e *man/rex_mode.Rd 520e45cdc56e80cf8a3880e477cf8d5f *man/shortcuts.Rd c20524af3764e8dd98262112e80d26e4 *man/single_shortcuts.Rd 66a9d5643b0694cd8af17f7490bd909d *man/wildcards.Rd ab1b350e9f314cd19cad3a33f3d15d22 *tests/testthat.R 8460417b6ecacce6923c11f0cc00e7c4 *tests/testthat/test-aaa.R fd21760f84c5daa4219d2d489f8680cb *tests/testthat/test-capture.R 2f5c3ae1786a65720984644017da675a *tests/testthat/test-character_class.R 23a69d020daf82a2be902ba458f16cc8 *tests/testthat/test-common.R f7a85c573c11ec2a129ae953049daf6e *tests/testthat/test-counts.R 634147c66c0fce93a13b5d99a9ffc5f7 *tests/testthat/test-escape.R b2353c062e208fe39c66b21bf2e46bc9 *tests/testthat/test-lookarounds.R 7b1a951319321a17f7c972365471306b *tests/testthat/test-match.R 2954762867e70d58745fdac2d23df348 *tests/testthat/test-or.R 90482fba54455f93d8cb2370246688d9 *tests/testthat/test-print.R 217ef7f57c6eba4353c876656a86736f *tests/testthat/test-rex_mode.R 472bc0c571d28a35dede6d62b34d73cd *tests/testthat/test-shortcuts.R ab9274947f4a6b7e133cdec30b5341c7 *tests/testthat/test-wildcards.R 959347e409b042544213f8fae02d991b *vignettes/NASA.txt 856eae22b696240b244ce83e9796f0fb *vignettes/log_parsing.Rmd 9838c708dc0669c5a14d59cb412cd5cd *vignettes/stackoverflow.R 148cd376374385379c63ae6c70161638 *vignettes/url_parsing.Rmd rex/build/0000755000176200001440000000000013172175577012166 5ustar liggesusersrex/build/vignette.rds0000644000176200001440000000035213172175577014525 0ustar liggesusersuK0+&( pNA#L#j jyrqP;z",m YJCn#x%dE&yMrņ;JdR7] TL=vryw]Mkoun@=6,HNKu9RЎz`˪_Qʁ3iɒ>BBo.rxzuPIi8o%Y3rex/DESCRIPTION0000644000176200001440000000221313172201330012544 0ustar liggesusersPackage: rex Type: Package Title: Friendly Regular Expressions Version: 1.1.2 Authors@R: c( person("Kevin", "Ushey", email = "kevinushey@gmail.com", role = "aut"), person("Jim", "Hester", email = "james.f.hester@gmail.com", role = c("aut", "cre")), person("Robert", "Krzyzanowski", email = "rkrzyzanowski@gmail.com", role = "aut") ) Maintainer: Jim Hester URL: https://github.com/kevinushey/rex BugReports: https://github.com/kevinushey/rex/issues Description: A friendly interface for the construction of regular expressions. Imports: magrittr, lazyeval License: MIT + file LICENSE Suggests: testthat, knitr, rmarkdown, dplyr, ggplot2, Hmisc, stringr, rvest, roxygen2, covr VignetteBuilder: knitr Collate: 'aaa.R' 'utils.R' 'escape.R' 'capture.R' 'character_class.R' 'counts.R' 'lookarounds.R' 'match.R' 'or.R' 'rex-mode.R' 'rex.R' 'shortcuts.R' 'wildcards.R' 'zzz.R' RoxygenNote: 6.0.1.9000 NeedsCompilation: no Packaged: 2017-10-19 19:22:40 UTC; jhester Author: Kevin Ushey [aut], Jim Hester [aut, cre], Robert Krzyzanowski [aut] Repository: CRAN Date/Publication: 2017-10-19 19:54:00 UTC rex/man/0000755000176200001440000000000012670364044011631 5ustar liggesusersrex/man/capture.Rd0000644000176200001440000000301213051325214013545 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/capture.R \name{capture} \alias{capture} \alias{.} \alias{capture_group} \title{Create a capture group} \usage{ capture(..., name = NULL) capture_group(name) } \arguments{ \item{...}{\code{\link{shortcuts}}, R variables, text, or other \pkg{rex} functions.} \item{name}{of the group. Unnamed capture groups are numbers starting at 1 in the order they appear in the regular expression. If two groups have the same name, the leftmost group is the used in any reference.} } \description{ Used to save the matched value within the group for use later in the regular expression or to extract the values captured. Both named and unnamed groups can later be referenced using \code{\link{capture_group}}. } \examples{ # Match paired quotation marks re <- rex( # first quotation mark capture(quotes), # match all non-matching quotation marks zero_or_more(except(capture_group(1))), # end quotation mark (matches first) capture_group(1) ) #named capture - don't match apples to oranges re <- rex( capture(name = "fruit", or("apple", "orange")), "=", capture_group("fruit") ) } \seealso{ \code{\link{group}} for grouping without capturing. Perl 5 Capture Groups \url{http://perldoc.perl.org/perlre.html#Capture-groups} Other rex: \code{\link{\%or\%}}, \code{\link{character_class}}, \code{\link{counts}}, \code{\link{group}}, \code{\link{lookarounds}}, \code{\link{not}}, \code{\link{rex}}, \code{\link{shortcuts}}, \code{\link{wildcards}} } rex/man/pipe.Rd0000644000176200001440000000032013051325214013036 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils.R \name{\%>\%} \alias{\%>\%} \title{Pipe operator} \usage{ lhs \%>\% rhs } \description{ Pipe operator } \keyword{internal} rex/man/lookarounds.Rd0000644000176200001440000000312713051325214014451 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/lookarounds.R \name{lookarounds} \alias{lookarounds} \alias{\%if_next_is\%} \alias{\%if_next_isnt\%} \alias{\%if_prev_is\%} \alias{\%if_prev_isnt\%} \title{Lookarounds} \usage{ x \%if_next_is\% y x \%if_next_isnt\% y x \%if_prev_is\% y x \%if_prev_isnt\% y } \arguments{ \item{x}{A regex pattern.} \item{y}{A regex pattern.} } \description{ Lookarounds } \details{ These functions provide an interface to perl lookarounds. Special binary functions are used to infer an ordering, since often you might wish to match a word / set of characters conditional on the start and end of that word. \itemize{ \item \code{\%if_next_is\%}: \code{TRUE} if x follows y \item \code{\%if_next_isnt\%}: \code{TRUE} if x does not follow y \item \code{\%if_prev_is\%}: \code{TRUE} if y comes before x \item \code{\%if_prev_isnt\%}: \code{TRUE} if y does not come before x } } \examples{ stopifnot(grepl(rex("crab" \%if_next_is\% "apple"), "crabapple", perl = TRUE)) stopifnot(grepl(rex("crab" \%if_prev_is\% "apple"), "applecrab", perl = TRUE)) stopifnot(grepl(rex(range("a", "e") \%if_next_isnt\% range("f", "g")), "ah", perl = TRUE)) stopifnot(grepl(rex(range("a", "e") \%if_next_is\% range("f", "i")), "ah", perl = TRUE)) } \seealso{ Perl 5 Documentation \url{http://perldoc.perl.org/perlre.html#Extended-Patterns} Other rex: \code{\link{\%or\%}}, \code{\link{capture}}, \code{\link{character_class}}, \code{\link{counts}}, \code{\link{group}}, \code{\link{not}}, \code{\link{rex}}, \code{\link{shortcuts}}, \code{\link{wildcards}} } rex/man/group.Rd0000644000176200001440000000156013051325214013244 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/capture.R \name{group} \alias{group} \title{Create a grouped expression} \usage{ group(...) } \arguments{ \item{...}{\code{\link{shortcuts}}, R variables, text, or other \pkg{rex} functions.} } \description{ This is similar to \code{\link{capture}} except that it does not store the value of the group. Best used when you want to combine several parts together and do not reference or extract the grouped value later. } \seealso{ \code{\link{capture}} for grouping with capturing. Perl 5 Extended Patterns \url{http://perldoc.perl.org/perlre.html#Extended-Patterns} Other rex: \code{\link{\%or\%}}, \code{\link{capture}}, \code{\link{character_class}}, \code{\link{counts}}, \code{\link{lookarounds}}, \code{\link{not}}, \code{\link{rex}}, \code{\link{shortcuts}}, \code{\link{wildcards}} } rex/man/wildcards.Rd0000644000176200001440000000253613051325214014070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wildcards.R \name{wildcards} \alias{wildcards} \alias{zero_or_more} \alias{one_or_more} \alias{maybe} \alias{zero_or_one} \title{Wildcards} \usage{ zero_or_more(..., type = c("greedy", "lazy", "possessive")) one_or_more(..., type = c("greedy", "lazy", "possessive")) maybe(..., type = c("greedy", "lazy", "possessive")) } \arguments{ \item{...}{\code{\link{shortcuts}}, R variables, text, or other \pkg{rex} functions.} \item{type}{the type of match to perform. There are three match types \enumerate{ \item \code{greedy}: match the longest string. This is the default matching type. \item \code{lazy}: match the shortest string. This matches the shortest string from the same anchor point, not necessarily the shortest global string. \item \code{possessive}: match and don't allow backtracking }} } \description{ Wildcards } \section{Functions}{ \itemize{ \item \code{zero_or_more}: match \code{...} zero or more times. \item \code{one_or_more}: match \code{...} one or more times. \item \code{maybe}: match \code{...} zero or one times. }} \seealso{ Other rex: \code{\link{\%or\%}}, \code{\link{capture}}, \code{\link{character_class}}, \code{\link{counts}}, \code{\link{group}}, \code{\link{lookarounds}}, \code{\link{not}}, \code{\link{rex}}, \code{\link{shortcuts}} } rex/man/single_shortcuts.Rd0000644000176200001440000000056313051325214015511 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shortcuts.R \docType{data} \name{single_shortcuts} \alias{single_shortcuts} \title{Single shortcuts} \format{An object of class \code{shortcut} of length 18.} \usage{ single_shortcuts } \description{ Each of these shortcuts has both a plural (-s) and inverse (non_) form. } \keyword{datasets} rex/man/character_class_escape.Rd0000644000176200001440000000216513051325214016553 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/escape.R \name{character_class_escape} \alias{character_class_escape} \alias{character_class_escape.regex} \alias{character_class_escape.character_class} \alias{character_class_escape.character} \alias{character_class_escape.list} \alias{character_class_escape.default} \title{Character class escapes} \usage{ character_class_escape(x) \method{character_class_escape}{regex}(x) \method{character_class_escape}{character_class}(x) \method{character_class_escape}{character}(x) \method{character_class_escape}{list}(x) \method{character_class_escape}{default}(x) } \arguments{ \item{x}{Object to escape.} } \description{ Character class escapes } \section{Methods (by class)}{ \itemize{ \item \code{regex}: objects are passed through unchanged. \item \code{character_class}: objects are passed through unchanged. \item \code{character}: objects properly escaped for character classes. \item \code{list}: call \code{character_class_escape} on all elements of the list. \item \code{default}: coerce to \code{character} and \code{character_class_escape}. }} rex/man/regex.Rd0000644000176200001440000000122713051325214013222 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rex.R \name{as.character.regex} \alias{as.character.regex} \alias{print.regex} \alias{regex} \title{Regular Expression} \usage{ \method{as.character}{regex}(x, ...) \method{print}{regex}(x, ...) regex(x, ...) } \arguments{ \item{x}{Object} \item{...}{further arguments} } \description{ Specify an explicit regular expression. This expression must already be escaped. } \section{Methods (by generic)}{ \itemize{ \item \code{as.character}: coerce regex object to a character \item \code{print}: Print regex object }} \seealso{ \code{\link{as.regex}} to coerce to a regex object. } rex/man/re_substitutes.Rd0000644000176200001440000000200413171405171015172 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/match.R \name{re_substitutes} \alias{re_substitutes} \alias{substitutes} \alias{s} \title{Substitute regular expressions in a string with another string.} \usage{ re_substitutes(data, pattern, replacement, global = FALSE, options = NULL, ...) } \arguments{ \item{data}{character vector to substitute} \item{pattern}{regular expression to match} \item{replacement}{replacement text to use} \item{global}{substitute all occurrences} \item{options}{option flags} \item{...}{options passed to sub or gsub} } \description{ Substitute regular expressions in a string with another string. } \examples{ string <- c("this is a Test", "string") re_substitutes(string, "test", "not a test", options = "insensitive") re_substitutes(string, "i", "x", global = TRUE) re_substitutes(string, "(test)", "not a \\\\1", options = "insensitive") } \seealso{ \code{\link{regexp}} Section "Perl-like Regular Expressions" for a discussion of the supported options } rex/man/counts.Rd0000644000176200001440000000315613051325214013426 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/counts.R \name{counts} \alias{counts} \alias{n_times} \alias{n} \alias{between} \alias{at_least} \alias{at_most} \title{Counts} \usage{ n_times(x, n, type = c("greedy", "lazy", "possessive")) between(x, low, high, type = c("greedy", "lazy", "possessive")) at_least(x, n, type = c("greedy", "lazy", "possessive")) at_most(x, n, type = c("greedy", "lazy", "possessive")) } \arguments{ \item{x}{A regex pattern.} \item{n}{An integer number} \item{type}{the type of match to perform. There are three match types \enumerate{ \item \code{greedy}: match the longest string. This is the default matching type. \item \code{lazy}: match the shortest string. This matches the shortest string from the same anchor point, not necessarily the shortest global string. \item \code{possessive}: match and don't allow backtracking }} \item{low}{An integer number for the lower limit.} \item{high}{An integer number for the upper limit.} } \description{ Functions to restrict a regex to a specific number } \section{Functions}{ \itemize{ \item \code{n_times}: \code{x} must occur exactly \code{n} times. \item \code{between}: \code{x} must occur between \code{low} and \code{high} times. \item \code{at_least}: \code{x} must occur at least \code{n} times. \item \code{at_most}: \code{x} must occur at most \code{n} times. }} \seealso{ Other rex: \code{\link{\%or\%}}, \code{\link{capture}}, \code{\link{character_class}}, \code{\link{group}}, \code{\link{lookarounds}}, \code{\link{not}}, \code{\link{rex}}, \code{\link{shortcuts}}, \code{\link{wildcards}} } rex/man/rex_mode.Rd0000644000176200001440000000051513051325214013711 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rex-mode.R \name{rex_mode} \alias{rex_mode} \title{Toggles \pkg{rex} mode.} \usage{ rex_mode() } \description{ While within rex mode, functions used within the \code{\link{rex}} function are attached, so one can get e.g. auto-completion within editors. } rex/man/re_matches.Rd0000644000176200001440000000304013171405135014221 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/match.R \name{re_matches} \alias{re_matches} \alias{matches} \alias{m} \title{Match function} \usage{ re_matches(data, pattern, global = FALSE, options = NULL, locations = FALSE, ...) } \arguments{ \item{data}{character vector to match against} \item{pattern}{regular expression to use for matching} \item{global}{use global matching} \item{options}{regular expression options} \item{locations}{rather than returning the values of the matched (or captured) string, return a \code{data.frame} of the match locations in the string.} \item{...}{options passed to regexpr or gregexpr} } \value{ if no captures, returns a logical vector the same length as the input character vector specifying if the relevant value matched or not. If there are captures in the regular expression, returns a \code{data.frame} with a column for each capture group. If \code{global} is \code{TRUE}, returns a list of \code{data.frame}s. } \description{ Match function } \examples{ string <- c("this is a", "test string") re_matches(string, rex("test")) # FALSE FALSE # named capture re_matches(string, rex(capture(alphas, name = "first_word"), space, capture(alphas, name = "second_word"))) # first_word second_word # 1 this is # 2 test string # capture returns NA when it fails to match re_matches(string, rex(capture("test"))) # 1 # 1 test # 2 } \seealso{ \code{\link{regexp}} Section "Perl-like Regular Expressions" for a discussion of the supported options } rex/man/escape.Rd0000644000176200001440000000163513051325214013353 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/escape.R \name{escape} \alias{escape} \alias{escape.regex} \alias{escape.character_class} \alias{escape.character} \alias{escape.default} \alias{escape.list} \title{Escape characters for a regex} \usage{ escape(x) \method{escape}{regex}(x) \method{escape}{character_class}(x) \method{escape}{character}(x) \method{escape}{default}(x) \method{escape}{list}(x) } \arguments{ \item{x}{Object to escape.} } \description{ Escape characters for a regex } \section{Methods (by class)}{ \itemize{ \item \code{regex}: Objects are simply passed through unchanged. \item \code{character_class}: Objects are surrounded by braces. \item \code{character}: Objects are properly escaped for regular expressions. \item \code{default}: default escape coerces to character and escapes. \item \code{list}: simply call escape on all elements of the list. }} rex/man/character_class.Rd0000644000176200001440000000557513051325214015243 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/character_class.R \name{character_class} \alias{character_class} \alias{one_of} \alias{any_of} \alias{some_of} \alias{none_of} \alias{except} \alias{except_any_of} \alias{except_some_of} \alias{range} \alias{:} \alias{exclude_range} \title{Create character classes} \usage{ character_class(x) one_of(...) any_of(..., type = c("greedy", "lazy", "possessive")) some_of(..., type = c("greedy", "lazy", "possessive")) none_of(...) except_any_of(..., type = c("greedy", "lazy", "possessive")) except_some_of(..., type = c("greedy", "lazy", "possessive")) range(start, end) ":"(start, end) exclude_range(start, end) } \arguments{ \item{x}{text to include in the character class (must be escaped manually)} \item{...}{\code{\link{shortcuts}}, R variables, text, or other \pkg{rex} functions.} \item{type}{the type of match to perform. There are three match types \enumerate{ \item \code{greedy}: match the longest string. This is the default matching type. \item \code{lazy}: match the shortest string. This matches the shortest string from the same anchor point, not necessarily the shortest global string. \item \code{possessive}: match and don't allow backtracking }} \item{start}{beginning of character class} \item{end}{end of character class} } \description{ There are multiple ways you can define a character class. } \section{Functions}{ \itemize{ \item \code{character_class}: explicitly define a character class \item \code{one_of}: matches one of the specified characters. \item \code{any_of}: matches zero or more of the specified characters. \item \code{some_of}: matches one or more of the specified characters. \item \code{none_of}: matches anything but one of the specified characters. \item \code{except_any_of}: matches zero or more of anything but the specified characters. \item \code{except_some_of}: matches one or more of anything but the specified characters. \item \code{range}: matches one of any of the characters in the range. \item \code{:}: matches one of any of the characters in the range. \item \code{exclude_range}: matches one of any of the characters except those in the range. }} \examples{ # grey = gray re <- rex("gr", one_of("a", "e"), "y") grepl(re, c("grey", "gray")) # TRUE TRUE # Match non-vowels re <- rex(none_of("a", "e", "i", "o", "u")) # They can also be in the same string re <- rex(none_of("aeiou")) grepl(re, c("k", "l", "e")) # TRUE TRUE FALSE # Match range re <- rex(range("a", "e")) grepl(re, c("b", "d", "f")) # TRUE TRUE FALSE # Explicit creation re <- rex(character_class("abcd\\\\[")) grepl(re, c("a", "d", "[", "]")) # TRUE TRUE TRUE FALSE } \seealso{ Other rex: \code{\link{\%or\%}}, \code{\link{capture}}, \code{\link{counts}}, \code{\link{group}}, \code{\link{lookarounds}}, \code{\link{not}}, \code{\link{rex}}, \code{\link{shortcuts}}, \code{\link{wildcards}} } rex/man/rex.Rd0000644000176200001440000000121413051325214012702 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rex.R \name{rex} \alias{rex} \alias{rex_} \title{Generate a regular expression.} \usage{ rex(..., env = parent.frame()) } \arguments{ \item{...}{\code{\link{shortcuts}}, R variables, text, or other \pkg{rex} functions.} \item{env}{environment to evaluate the rex expression in.} } \description{ Generate a regular expression. } \seealso{ Other rex: \code{\link{\%or\%}}, \code{\link{capture}}, \code{\link{character_class}}, \code{\link{counts}}, \code{\link{group}}, \code{\link{lookarounds}}, \code{\link{not}}, \code{\link{shortcuts}}, \code{\link{wildcards}} } rex/man/or.Rd0000644000176200001440000000134413051325214012530 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/or.R \name{\%or\%} \alias{\%or\%} \alias{or} \title{Or} \usage{ x \%or\% y or(...) } \arguments{ \item{x}{A string.} \item{y}{A string.} \item{...}{\code{\link{shortcuts}}, R variables, text, or other \pkg{rex} functions.} } \description{ The special binary function \code{\%or\%} can be used to specify a set of optional matches. describeIn or regular function can also be used, useful for more than 2 arguments. } \seealso{ Other rex: \code{\link{capture}}, \code{\link{character_class}}, \code{\link{counts}}, \code{\link{group}}, \code{\link{lookarounds}}, \code{\link{not}}, \code{\link{rex}}, \code{\link{shortcuts}}, \code{\link{wildcards}} } rex/man/register_shortcuts.Rd0000644000176200001440000000075113051325214016053 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rex.R \name{register_shortcuts} \alias{register_shortcuts} \title{Register the Rex shortcuts} \usage{ register_shortcuts(pkg_name) } \arguments{ \item{pkg_name}{the package to register the shortcuts in} } \description{ If you are using rex in another package you need to call this function to register all of the rex shortcuts so that spurious NOTEs about global variables being generated during R CMD check. } rex/man/as.regex.Rd0000644000176200001440000000100612670364044013631 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rex.R \name{as.regex} \alias{as.regex} \alias{as.regex.default} \title{Coerce objects to a \code{\link{regex}}.} \usage{ as.regex(x, ...) \method{as.regex}{default}(x, ...) } \arguments{ \item{x}{Object to coerce to \code{\link{regex}}.} \item{...}{further arguments passed to methods.} } \description{ Coerce objects to a \code{\link{regex}}. } \section{Methods (by class)}{ \itemize{ \item \code{default}: Simply escape the Object. }} rex/man/not.Rd0000644000176200001440000000167513051325214012717 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wildcards.R \name{not} \alias{not} \title{Do not match} \usage{ not(..., type = c("greedy", "lazy", "possessive")) } \arguments{ \item{...}{\code{\link{shortcuts}}, R variables, text, or other \pkg{rex} functions.} \item{type}{the type of match to perform. There are three match types \enumerate{ \item \code{greedy}: match the longest string. This is the default matching type. \item \code{lazy}: match the shortest string. This matches the shortest string from the same anchor point, not necessarily the shortest global string. \item \code{possessive}: match and don't allow backtracking }} } \description{ Do not match } \seealso{ Other rex: \code{\link{\%or\%}}, \code{\link{capture}}, \code{\link{character_class}}, \code{\link{counts}}, \code{\link{group}}, \code{\link{lookarounds}}, \code{\link{rex}}, \code{\link{shortcuts}}, \code{\link{wildcards}} } rex/man/shortcuts.Rd0000644000176200001440000000131213051325214014141 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shortcuts.R \docType{data} \name{shortcuts} \alias{shortcuts} \title{Shortcuts} \format{An object of class \code{shortcut} of length 116.} \usage{ shortcuts } \description{ Commonly used character classes and regular expressions. These shortcuts are substituted inside \code{rex} calls. } \details{ \code{names(shortcuts)} will give you the full list of available shortcuts. } \seealso{ Other rex: \code{\link{\%or\%}}, \code{\link{capture}}, \code{\link{character_class}}, \code{\link{counts}}, \code{\link{group}}, \code{\link{lookarounds}}, \code{\link{not}}, \code{\link{rex}}, \code{\link{wildcards}} } \keyword{datasets} rex/LICENSE0000644000176200001440000000007712670366357012100 0ustar liggesusersYEAR: 2014-2016 COPYRIGHT HOLDER: James Hester and Kevin Ushey